async/await 是 promise 的语法糖,本质为引擎对 promise 链的自动封装与调度优化:async 函数自动返回 promise,await 将后续代码放入微任务队列,底层由 v8 编译为 promise.then 状态机。

async 与 await 不是新异步机制,而是 Promise 的语法糖,本质是 JavaScript 引擎对 Promise 链的自动封装和调度优化。
async 函数:自动包装 Promise 的声明方式
只要函数被 async 修饰,无论返回什么值,都会被隐式转为 Promise:
- return 42 → 等价于 return Promise.resolve(42)
- return undefined 或无 return → 自动返回 Promise.resolve(undefined)
- throw new Error() → 等价于 return Promise.reject(new Error())
这意味着调用 async 函数,得到的一定是一个 Promise 实例,可直接接 .then() 或 await,无需手动包装。
await 表达式:微任务驱动的执行暂停点
await 并不“阻塞线程”,也不“等待时间”,它只是告诉引擎:把当前 await 后面的表达式求值(必须是 thenable,否则会被 Promise.resolve() 包装),然后暂停函数执行,把后续代码放进微任务队列,在当前宏任务结束后、下一个宏任务开始前执行。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- await 123 → 立即进入微任务,等同于 Promise.resolve(123).then(...)
- await fetch('/api') → 等待 fetch 返回的 Promise settle 后,再继续执行下一行
- await 只能在 async 函数或模块顶层(ES2022+)中使用,因为需要上下文支持状态机切换
底层实现:V8 中的状态机编译
V8 引擎会将 async 函数重写为基于 Promise.then 的状态机:
- 每个 await 对应一个状态节点
- 函数体被拆成多个片段,由 Promise.then 串联
- try/catch 被映射为 .catch 分支,错误传播路径与 Promise 一致
- 整个过程不依赖 generator 或 function*,但逻辑结构高度相似
这种编译方式让 async/await 既保持同步书写体验,又严格遵循事件循环模型。
常见误解澄清
很多人误以为 await 是“通用等待”,其实它只作用于 Promise 状态流转:
- await 不等于 setTimeout —— 它不控制时间,只响应 Promise 结果
- await 后跟普通值不是“无效”,而是立刻 resolve,常被用于统一处理返回值类型
- 串行 await 并非性能问题根源,真正影响并发的是没用 Promise.all 等并行工具
理解这一点,才能写出既清晰又高效的异步逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










