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

async/await执行顺序疑问:代码跳转与microtask作用机制解析

为什么代码会从标记*处跳转到**处?microtask在这里的作用是什么?

咱们一步步拆解这段代码的执行流程,就能明白原因:

  1. 调用async1()后,立刻进入函数执行同步代码console.log('Async 1'),输出 Async 1。
  2. 走到await async2()(标记*处)时:
    • 先执行async2(),因为它是async函数,调用后会立即跑内部的同步代码console.log('FROM async 2'),输出 FROM async 2。
    • async2执行完会返回一个已完成状态的Promise。这时候await会触发两个关键行为:
      • 把async1里await后面的代码(也就是console.log('AFter Async 1'))打包成一个microtask,放进microtask队列排队。
      • 暂停async1的执行,把控制权交还给当前的调用栈。
  3. 调用栈回到全局环境,继续执行剩下的同步代码console.log('Synchronous')(标记**处),输出 Synchronous。
  4. 所有同步代码都执行完、调用栈清空后,事件循环才会去处理microtask队列,把之前排队的那个microtask拿出来执行,也就是输出 AFter Async 1。

核心逻辑就是:await会在执行完右侧的表达式后,将后续代码延迟到所有同步任务完成后,通过microtask来执行。这就是为什么代码会从*处跳去执行**处的同步代码——await主动让出了控制权,让同步任务先全部跑完,再回头处理自己后续的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:45:49