Dart的..级联操作符是否会等待Future?两种异步写法是否等价?
回答
- 针对问题1:
..级联操作符不会自动等待writeAsString的异步写入操作完成。Dart的级联操作符的核心逻辑是始终返回左侧的调用对象本身,它只会触发右侧的方法调用,但不会对异步方法返回的Future做任何等待处理,写入操作会在后台独立运行,和返回逻辑无关。 - 针对问题2:重构后的写法会在写入操作完成前就返回原始的File对象。
writeAsString返回的Future<File>会被直接丢弃,你既无法感知写入的完成时机,也拿不到写入完成后的File返回值,拿到返回的File实例时写入操作大概率还在执行中。 - 针对问题3:两种写法功能完全不等价,核心差异如下:
原写法会依次等待File对象创建完成、写入操作执行完成,最终返回写入完成后的File对象,写入过程抛出的异常可以被上层正常捕获。
重构后的写法仅等待了File对象创建完成,触发写入操作后就立刻返回了原始File对象,不仅无法感知写入是否成功、是否完成,写入过程抛出的异常还会变成未捕获的异步异常,如果拿到返回值后立刻读取文件内容,大概率只能读到空内容或旧内容。
如果要实现和原写法完全等价的单行写法,不需要使用级联操作符,调整为如下形式即可:
return await (await makeFileObject(filename)).writeAsString(content);
内容的提问来源于stack exchange,提问作者MetaStack
相关产品推荐
相关产品推荐

