【问题标题】:How to know if a certain future is complete by avoiding a chain of future as return types?如何通过避免将未来链作为返回类型来知道某个未来是否完整?
【发布时间】:2025-11-28 18:20:06
【问题描述】:

场景

如果我想从文件中读取数据并将数据存储在地图中,并且该地图被多次用于验证。

我是否可以这样做而无需将使用上述映射的所有方法的返回类型更改为 Future?

例子:

Map metadata = null
Future readFromFile async {
 .... metadata = await File.readingfromFile(...);
}

Future getRegion(..) async {
  if(metadata == null) { await readFromFile() }
  return metadata["region"]
}

使用上述代码,如果一个方法(如 isValidRegion 等)使用并需要 getRegion(..) 来完成,那么 isValidRegion 的返回类型应该转换为 Future。

Future<bool> isValidRegion(..) async {
   return ((await getRegionData(...)) != null )
}

如果 isValidRegion 存在于其他方法中,则它们的返回类型也必须更改为 Future。

Future<String> parse(...) async {
   ....
   if(await isValidRegion()) {
    ...
    }
...
}

什么是避免这种期货链作为返回类型的优雅方法?

【问题讨论】:

    标签: dart


    【解决方案1】:

    异步执行具有传染性,您无法从异步执行恢复到同步执行。

    您可以做的是从文件中同步读取以避免问题(如果可以的话,如果您从网络连接读取它,这可能是不可能的)。

    【讨论】:

    • Bob Nystrom 有一篇关于异步传染性的精彩文章:journal.stuffwithstuff.com/2015/02/01/…。换句话说,是的,这是个问题,你无能为力。
    • 有趣。感谢您的回复。我想知道其他主要库如何处理文件读取并避免传染性。我可能不得不寻找一个并进行调查。
    最近更新 更多