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

JavaScript事件循环疑问:await后的同步代码为何被放入微任务?

关于async/await中微任务的疑问解答

先结合你的代码拆解执行流程和核心原因:

async function async1() {
  console.log("async1 start");
  await async2();
  console.log("async1 end");  // 为什么这个任务会被放入微任务?
}
async function async2() {
  console.log("async2");
}
async1();
console.log("script end");

执行步骤拆解

  • 调用async1()后,首先同步执行console.log("async1 start"),输出async1 start。
  • 遇到await async2(),先同步执行async2(),里面的console.log("async2")立即输出async2。
  • 这里是核心逻辑:所有async函数默认都会返回一个已决议(resolved)的Promise,哪怕函数里没有显式写return。await的机制是:等待右侧表达式的Promise完成后,将await之后的代码注册为微任务,然后暂停当前async函数的执行,跳出到主线程继续执行同步任务。
  • 所以此时console.log("async1 end")不会立即执行,而是被放进了微任务队列。
  • 主线程继续执行同步代码console.log("script end"),输出script end。
  • 当所有同步任务执行完毕后,JavaScript引擎会清空微任务队列,此时才执行console.log("async1 end"),输出async1 end。

为什么那行console.log不是同步任务?

await本质是Promise的语法糖,哪怕后面跟着的函数没有异步操作,它依然会触发Promise的决议流程。相当于把await之后的代码放到了Promise.resolve(async2()).then(() => { console.log("async1 end") })里,而Promise的then回调属于微任务,所以这行代码自然会被放入微任务队列,而非同步执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:42:44