为何await未按预期等待?Dart异步代码执行顺序异常排查
为什么Dart中的await没有按预期等待,导致执行顺序不符?
咱们直接拆解问题核心:你期望两个异步函数顺序执行,但实际它们是并发启动的,根本原因是main函数没有等待这两个异步任务完成,再加上函数内部的await细节,才导致输出和预期不符。
先看第一段返回Future的代码分析
你的代码:
Future printSleep1() async{ print('Start sleep1'); return await new Future.delayed(const Duration(seconds: 1), () => print('End sleep1')); } Future printSleep2() async{ print('Start sleep2'); return new Future.delayed(const Duration(seconds: 1), () => print('End sleep2')); } main() { printSleep1(); printSleep2(); }
执行流程是这样的:
- 调用
printSleep1()时,会同步执行到第一个await:先打印Start sleep1,然后遇到await Future.delayed——这时候当前函数会暂停,把“1秒后打印End sleep1”的任务扔进事件队列,然后printSleep1()返回一个未完成的Future给main。 - main函数完全没理会这个返回的Future,立刻去调用
printSleep2():同样同步打印Start sleep2,然后把“1秒后打印End sleep2”的任务扔进事件队列,返回Future给main(main还是不管)。 - 1秒后,事件队列里的两个延迟任务依次执行,就出现了
End sleep1 End sleep2的输出。
所以整体输出就是Start sleep1 Start sleep2 End sleep1 End sleep2,和你预期的顺序不一样。
再看第二段不返回Future的代码分析
你的代码:
printSleep1() async{ print('Start sleep1'); await new Future.delayed(const Duration(seconds: 1), () => print('End sleep1')); } printSleep2() async{ print('Start sleep2'); new Future.delayed(const Duration(seconds: 1), () => print('End sleep2')); } main() { printSleep1(); printSleep2(); }
这里有个容易忽略的点:Dart中所有async函数默认都会返回Future<void>,哪怕你没显式声明返回类型。所以这段代码的执行逻辑和第一段本质没区别:
printSleep1()执行到await时暂停,扔延迟任务到队列,返回Future给main,但main不等待,直接调用printSleep2()。printSleep2()里没有await那个Future.delayed,所以它打印Start sleep2后,直接把延迟任务扔队列,函数就结束了(返回的Future立刻完成)。- 同样1秒后两个延迟任务执行,输出顺序还是和第一段一致。
怎么改成你预期的输出?
要让两个函数顺序执行,必须在main函数里await这两个异步任务的完成,修改后的main函数如下:
main() async { await printSleep1(); await printSleep2(); }
这样main会先等待printSleep1()的Future完全完成(也就是End sleep1打印完毕),再去调用printSleep2(),就能得到你想要的输出:
Start sleep1 End sleep1 Start sleep2 End sleep2
关键知识点总结
await的作用是暂停当前async函数,让后续代码等待某个Future完成,但它不会阻止调用者继续执行其他代码——除非调用者也用await等待这个async函数的返回结果。- 异步函数被调用时,会先同步执行到第一个
await(或函数结束),之后的逻辑才会被放到事件队列中等待执行。
内容的提问来源于stack exchange,提问作者Chris G.
相关产品推荐
相关产品推荐

