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

Dart异步函数执行顺序疑问:无await时为何同步执行?

Dart异步函数执行顺序解析

核心结论

async关键字本身不会让函数自动变成异步执行,只有当函数内部遇到await时,才会触发异步逻辑的拆分。

第一个例子:无await的async函数

看你给出的第一段代码:

void main() async {
  print(1);
  f1();
  print(3);
}

void f1() async {
  print(2);
}

虽然f1被标记为async,但函数内部没有任何await语句。此时f1的执行逻辑和普通同步函数完全一致:main函数调用f1()时,会立即进入f1执行print(2),执行完后回到main继续执行print(3),所以输出顺序是1→2→3,确实是同步执行的。

第二个例子:加入await后的异步拆分

当你在f1里加入await Future.delayed(Duration.zero)后:

void main() async {
  print(1);
  f1();
  print(3);
}

void f1() async {
  await Future.delayed(Duration.zero);
  print(2);
}

这里的关键是await的作用:

  1. 执行到await时,Dart会暂停f1的执行,先返回一个未完成的Future给调用者(也就是main函数)。
  2. main函数不会等待这个Future完成,直接继续执行print(3)。
  3. 当同步代码全部执行完毕后,Dart的事件循环会处理微任务队列,此时才会继续执行f1中await之后的print(2)。

所以最终输出顺序变成1→3→2,符合你的预期。

补充:Dart事件循环的基本逻辑

Dart的代码执行遵循以下优先级:

  • 先执行所有同步代码
  • 再处理微任务队列(比如await后续的代码、Future.microtask的回调)
  • 最后处理事件队列(比如Timer、IO操作回调)
    Future.delayed(Duration.zero)本质上是把后续代码调度到微任务队列,所以会在同步代码之后执行。

内容的提问来源于stack exchange,提问作者Ralfeus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:00:56