Dart中的未来/异步/等待
问题内容:
我有一个loadData
从文件加载一些文本的功能:
Future<String> loadAsset() async {
return await rootBundle.loadString('assets/data/entities.json');
}
该loadString
方法来自Flutter SDK,并且是异步的。
在loadAsset
随后的方法被调用的另一种方法,那肯定我作为标记async
,因为loadAsset
是异步,我需要使用await
:
Future<List<Entity>> loadEntities() async {
String jsonData = await loadAsset();
return parseData(jsonData);
}
该parseData
方法不是异步的,它接收String
,解析它并返回对象列表:
List<Entity> parseData(String jsonString) {
...
}
但是由于loadEntities
必须标记为async
,所以要求它返回a
Future
,但是实际上,这不是Future
因为我使用await
,所以它等待loadAsset
方法完成,然后parseData
使用结果调用函数。
这很容易变成async
调用滚雪球,因为使用的每个方法也都loadEntities
必须标记为async
。
另外,我不能loadEntities
在类构造函数中使用,因为构造函数应标记为async
,这在Dart中是不允许的。
我async/await
在Dart中使用模式错误吗?如何loadEntities
在类构造函数中使用该方法?
问题答案:
不,异步具有传染性,没有办法从异步返回到同步执行。
async
/ await
仅用于methodThatReturnsFuture().then(...)
用标记方法async
仅允许您await
在其内部使用。否则,async
您仍然需要返回一个Future
用于调用的代码,仅在结果loadAsset()
可用后才能执行。