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
相关产品推荐
相关产品推荐

