await 不会隐式创建微任务,而是将 await 后代码作为 promise.then 回调推入微任务队列;执行上下文被暂停并快照保存,待 promise settle 后恢复;微任务入队时机取决于 promise 状态,全程运行在单线程事件循环中。

await 并不会“隐式创建微任务”,而是让 JavaScript 引擎在遇到 await 时暂停当前 async 函数的执行上下文,并将后续代码(即 await 右侧表达式求值完成后的逻辑)作为 微任务 排入队列——这个微任务由 Promise 的 then 内部机制自动调度,不是 await 自己手动调用 queueMicrotask。
await 的本质是语法糖,底层依赖 Promise.then
当你写:
async function foo() {
const res = await fetch('/api').then(r => r.json());
console.log(res);
}
等价于(简化示意):
function foo() {
return fetch('/api')
.then(r => r.json())
.then(res => {
console.log(res); // 这部分被包装进微任务
return res;
});
}
也就是说:await x 会把 x 转为 Promise(若还不是),然后在该 Promise fulfilled 时,把 await 后面的代码作为回调推入微任务队列。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
执行上下文确实被“切断”,但不是销毁
async 函数执行到 await 时:
- 当前函数暂停,控制权交还给事件循环;
- 引擎保存其执行上下文(如变量环境、词法环境、await 位置等),但不保留在调用栈中;
- 后续代码不会立即执行,要等 Promise settle 后,引擎从上下文快照中恢复执行 —— 这叫 协程式挂起与恢复,不是传统意义上的“切断”或“丢弃”。
微任务插入时机由 Promise 状态决定
关键点在于:await 后的微任务何时入队?
- 如果
await的 Promise 已经 fulfilled(例如await Promise.resolve(42)),那么后续代码会作为微任务 **立刻入队**,并在本轮宏任务结束前执行; - 如果 Promise 还未 settle(如网络请求),那后续代码要等到它 resolve/reject 后,再由 Promise 内部调用
then触发微任务入队; - reject 情况同理,错误会被捕获并抛到 async 函数内(除非用
try/catch或.catch处理)。
这不是“后台”操作,而是标准事件循环协作
所谓“后台”容易误解 —— await 不开新线程、不启新进程、不脱离主线程。它完全运行在单线程的 JS 执行环境中,依靠:
- V8(或其它引擎)对 async/await 的状态机编译(生成类似 generator 的内部结构);
- Promise 的
resolve和reject回调自动注册为微任务; - 事件循环在每次宏任务结束时,清空微任务队列。
所以,“切断上下文”是暂停 + 快照 + 恢复;“微任务”是 Promise 协议的一部分,await 只是优雅地消费它。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










