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的作用:
- 执行到
await时,Dart会暂停f1的执行,先返回一个未完成的Future给调用者(也就是main函数)。 - main函数不会等待这个
Future完成,直接继续执行print(3)。 - 当同步代码全部执行完毕后,Dart的事件循环会处理微任务队列,此时才会继续执行
f1中await之后的print(2)。
所以最终输出顺序变成1→3→2,符合你的预期。
补充:Dart事件循环的基本逻辑
Dart的代码执行遵循以下优先级:
- 先执行所有同步代码
- 再处理微任务队列(比如await后续的代码、
Future.microtask的回调) - 最后处理事件队列(比如Timer、IO操作回调)
Future.delayed(Duration.zero)本质上是把后续代码调度到微任务队列,所以会在同步代码之后执行。
内容的提问来源于stack exchange,提问作者Ralfeus
相关产品推荐
相关产品推荐

