async/await执行顺序疑问:代码跳转与microtask作用机制解析
为什么代码会从标记*处跳转到**处?microtask在这里的作用是什么?
咱们一步步拆解这段代码的执行流程,就能明白原因:
- 调用
async1()后,立刻进入函数执行同步代码console.log('Async 1'),输出 Async 1。 - 走到
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的执行,把控制权交还给当前的调用栈。
- 把
- 先执行
- 调用栈回到全局环境,继续执行剩下的同步代码
console.log('Synchronous')(标记**处),输出 Synchronous。 - 所有同步代码都执行完、调用栈清空后,事件循环才会去处理microtask队列,把之前排队的那个microtask拿出来执行,也就是输出 AFter Async 1。
核心逻辑就是:await会在执行完右侧的表达式后,将后续代码延迟到所有同步任务完成后,通过microtask来执行。这就是为什么代码会从*处跳去执行**处的同步代码——await主动让出了控制权,让同步任务先全部跑完,再回头处理自己后续的逻辑。
内容的提问来源于stack exchange,提问作者user19591368
相关产品推荐
相关产品推荐

