为何Dart的async方法中await未生效?两段代码差异解析
为何await在async方法中未生效?
第一段代码(await未生效)
Future<void> f1() async{ Future.delayed(Duration(seconds:2), (){ print('f1'); }); } void main() async{ print('start'); await f1(); print('end'); }
输出:
start end f1
第二段代码(await正常生效)
Future<void> f1() async{ return Future.delayed(Duration(seconds:2), (){ print('f1'); }); } void main() async{ print('start'); await f1(); print('end'); }
输出:
start f1 end
差异原因
核心在于async函数内部创建的Future是否被关联到函数返回的Future上:
- 第一段代码中,
f1作为async函数会自动生成并返回一个空的Future,但函数体里只是创建了Future.delayed却没有对它做任何处理——既没有用await等待它完成,也没有把它作为返回值。这意味着f1的同步代码执行完(也就是创建完Future.delayed对象)后,它返回的Future就立刻完成了。所以main里的await f1()只会等待f1的同步逻辑结束,不会等内部的Future.delayed,于是直接打印end,而Future.delayed会在后台继续执行,2秒后才打印f1。 - 第二段代码中,
f1把Future.delayed作为返回值返回了。此时async函数生成的返回Future会和这个返回的Future.delayed绑定,await f1()实际上是在等待这个Future.delayed完成。只有当2秒后Future.delayed执行完、打印f1之后,f1返回的Future才会完成,main才会继续执行print('end')。
额外补充:如果不想返回这个Future,也可以在f1内部用await Future.delayed(...),效果和返回它完全一致——async函数会等待内部的await操作完成后,才会让自己的返回Future结束。
内容的提问来源于stack exchange,提问作者user98396
相关产品推荐
相关产品推荐

