async/await 是 promise 与 generator 结合的语法糖,本质是引擎自动完成“同步写法→异步调度”转换:async 统一返回 promise,await 在 async 函数内暂停执行并交还控制权,底层依托 generator 协程思想实现,核心价值在于提升异步编程体验而非性能。

async/await 的本质是Promise + Generator 的语法糖,不是新机制,而是 JavaScript 引擎在编译和执行阶段自动完成的“同步写法 → 异步调度”转换。
async 是 Promise 的自动包装器
只要函数用 async 声明,无论 return 什么,它都必定返回一个 Promise:
- return 普通值(如
return 42)→ 自动等价于Promise.resolve(42) - throw 错误 → 自动等价于
Promise.reject(new Error(...)) - 不写 return → 等价于
Promise.resolve(undefined)
也就是说,async 不改变异步逻辑,只统一了返回形态——你拿到的永远是一个 Promise,可直接 .then() 或 await 调用。
await 是暂停点,不是阻塞指令
await 只能在 async 函数内使用,它的作用是:
- 对右侧表达式求值(比如
await fetch(...),先执行 fetch 得到 Promise) - 若该值是 Promise,就暂停当前 async 函数的执行,把控制权交还给事件循环
- 等 Promise settle(fulfilled 或 rejected)后,将函数剩余逻辑作为微任务加入队列,恢复执行
注意:暂停的是这个函数内部的后续代码,不是整个 JS 线程。外部同步代码照常运行,这就是为什么 console.log('先执行') 会出现在 await 结果之前。
底层靠 Generator + Promise 协同实现
虽然现代引擎已原生支持 async/await,但它的设计思想源于 Generator 协程能力:
- Generator 用
yield暂停、next()恢复,天然适合“等待异步结果再继续” - 但 Generator 不自动执行,需要 co 库或手动调度;await 把这套流程完全隐藏了
- Babel 等工具曾将其转译为 Generator + Promise 封装(如
spawn(function*{...})),印证了这一底层逻辑
所以它不是魔法,而是把开发者原本要手动写的“暂停→等待→恢复”流程,由引擎自动托管。
它解决的核心问题是编程体验
async/await 不提升性能,也不改变异步本质,但它让代码更贴近人类思维:
- 告别层层嵌套的回调或冗长的 .then 链
- 变量可自然声明、复用、调试(不用再为中间值反复传参)
- 错误可用 try/catch 统一捕获,语义清晰、定位精准
本质上,它是 JavaScript 为降低异步认知负担而做的最成功的语法封装。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











