一尘不染

Dart中的未来/异步/等待

flutter

我有一个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在类构造函数中使用该方法?


阅读 292

收藏
2020-08-13

共1个答案

一尘不染

不,异步具有传染性,没有办法从异步返回到同步执行。

async/ await仅用于methodThatReturnsFuture().then(...)

用标记方法async仅允许您await在其内部使用。否则,async您仍然需要返回一个Future用于调用的代码,仅在结果loadAsset()可用后才能执行。

2020-08-13