async/await是generator+promise的语法糖,由引擎原生支持,无需手动执行器;async函数返回promise,await自动等待其完成,错误用try/catch统一处理,而generator需配合co等执行器及next()调用。

async/await 是 JavaScript 中用于处理异步操作的现代语法,它本质上是 Generator + Promise 的语法糖封装,但比手动使用 function* 和 yield 更简洁、更易读、更贴近同步逻辑。它不是“替代 Generator”的工具,而是让异步流程控制更自然的演进方案。
核心差异:async/await 消除了手动执行器
Generator 本身不执行异步逻辑,它只暂停/恢复执行;真正驱动它运行(比如自动调用 next()、处理 Promise)需要额外写一个“执行器”(如 co 库或自定义 runner)。而 async/await 由引擎原生支持,无需手动调度:
- 一个
async function返回 Promise,调用即启动,await自动等待 Promise resolve/reject - 不需要
function*、yield、next()、throw()等底层机制 - 错误统一用
try/catch捕获,不用监听 Promise 的catch或执行器的 reject 回调
等价写法对比:从 Generator 到 async/await
假设要依次请求三个接口并拼接结果:
// Generator + co(旧方式)
const co = require('co');
function* fetchUserData() {
const user = yield fetch('/api/user');
const posts = yield fetch(`/api/posts?uid=${user.id}`);
const profile = yield fetch(`/api/profile?uid=${user.id}`);
return { user, posts, profile };
}
co(fetchUserData).then(console.log);
// async/await(推荐方式)
async function fetchUserData() {
const user = await fetch('/api/user');
const posts = await fetch(`/api/posts?uid=${user.id}`);
const profile = await fetch(`/api/profile?uid=${user.id}`);
return { user, posts, profile };
}
fetchUserData().then(console.log);
两者语义一致,但后者没有额外依赖、无执行器、可直接在浏览器和 Node.js 中运行。
Generator 还有适用场景吗?
是的——当需要**精细控制迭代过程**(如惰性求值、状态机、协程式流控)时,Generator 仍有不可替代性:
- 实现自定义迭代器(
[Symbol.iterator])、生成无限序列(如斐波那契) - 构建中间件管道(Koa 1.x 的洋葱模型本质是 Generator 链)
- 需要多次暂停/恢复且每次恢复传入不同值(
gen.next(value))
async/await 不支持“恢复时传参”,也不适合做非 Promise 的暂停(如 yield 42),所以它不覆盖 Generator 的全部能力,只是接管了“Promise 驱动的异步流程”这一最常见场景。
迁移建议:什么时候该换?
如果你的代码满足以下条件,就该用 async/await 替代 Generator:
- 只用
yield等待 Promise,没用到gen.next()/gen.throw()传参 - 项目已支持 ES2017+(Chrome 55+/Node.js 7.6+),无需兼容老环境
- 没有引入
co或类似执行器,或者想移除这类依赖
只需把 function* 改成 async function,yield 改成 await,去掉执行器调用即可,几乎零学习成本。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











