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

事件循环如何内部处理async/await?代码场景下的执行逻辑问询

Async函数中await后的事件循环处理逻辑

先明确:async/await本质是Promise的语法糖,它的执行逻辑完全基于Promise的回调调度机制,核心是「执行状态保存+微任务调度」。

针对你给出的foo函数,完整执行流程是这样的:

  • 调用foo(x,y)时,先同步执行x = x+1,遇到await fetch(...)后,首先fetch会返回一个未决状态(pending)的Promise。
  • 此时JavaScript引擎会把foo当前的执行上下文(包括x、y的当前值,以及接下来要执行y = y+1的代码位置)完整保存下来,然后把foo的执行上下文从调用栈中弹出,释放事件循环去处理其他任务。
  • 当fetch请求完成,对应的Promise变为已决状态(resolved/rejected)时,引擎会把foo中await之后的剩余代码(也就是y = y+1)包装成一个微任务(microtask),添加到微任务队列。
  • 当当前调用栈为空、所有同步任务执行完毕后,事件循环会优先处理微任务队列:取出这个微任务,恢复之前保存的foo执行上下文,继续执行y = y+1,直到foo函数执行完成。

关键疑问解答:上下文弹出后,引擎怎么知道要执行后续代码?

其实await的本质是给对应的Promise注册了一个延续回调(continuation)——这个回调就是await之后的剩余代码,同时引擎会把当前函数的执行状态和这个回调绑定在一起。当Promise状态改变时,这个回调会被自动放入微任务队列,事件循环只要按规则处理队列,就能找到并执行后续代码,根本不需要调用栈一直保留foo的上下文。

相关规范说明

根据ECMAScript规范,async函数的执行会被拆分为多个「执行阶段」:

  1. 进入async函数后,同步执行到await表达式;
  2. 暂停函数执行,将函数的执行上下文挂起保存;
  3. 等待的Promise settle后,将函数的「延续部分」(即await之后的代码)加入微任务队列;
  4. 微任务被调度时,恢复挂起的执行上下文,继续完成函数剩余部分的执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:03:24