You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:09:23