async/await 是建立在 promise 之上、吸收 generator 协程思想的语法糖,自动管理状态机与错误处理,返回统一 promise,调试友好且开发体验更接近同步代码。

async/await 是 Generator 的语法糖,但不是简单替代
async/await 并非凭空出现,它建立在 Promise 之上,同时吸收了 Generator 的协程思想。Generator 用 yield 暂停执行、靠外部调用 next() 恢复;而 async/await 把这个控制权收回到语言层面——await 自动等待 Promise 完成后继续执行,无需手动迭代器管理。本质上,async 函数内部就是一个自动运行的状态机,省去了手写执行器(如 co 库)的步骤。
错误处理更直观,不需要 try-catch 套 yield
Generator 处理异步错误需配合 throw 方法和外部捕获逻辑,容易遗漏或嵌套过深。比如 yield 一个失败的 Promise 后,必须在 next() 的回调里检查并调用 generator.throw(),流程松散且易出错。
- Generator 中错误要靠外部传递:g.next() → .catch() → g.throw(err)
- async/await 可直接用标准 try/catch 包裹 await 表达式,语义清晰、作用域明确
- Promise 链中未捕获的 reject 会静默失败,而 async 函数中未 catch 的 await 错误会直接抛出,行为更可预测
返回值语义统一,不再混淆迭代器与 Promise
Generator 调用后返回的是迭代器对象,它的 .next() 返回 { value, done } 结构,和业务数据类型不一致;而 async 函数调用即返回 Promise,与现代 JS 异步生态(fetch、setTimeout 封装等)天然兼容。
- 你不能直接 await 一个 Generator 函数,必须用库包装(如 co)或自己实现执行器
- async 函数返回 Promise,可直接被其他 async 函数 await,也可用 .then()/.catch() 消费
- Generator 的 value 字段可能是 Promise、原始值或 undefined,类型不确定;await 的右侧必须是 thenable,约束更强、更安全
开发体验接近同步代码,调试也更友好
Generator 的执行流被切分成多个 next() 调用点,堆栈中断、断点难设、调试器无法自然“单步跟进”异步逻辑。async/await 保持函数连续性,DevTools 支持 await 行暂停、变量作用域完整可见,call stack 清晰反映实际调用链。
- 编辑器对 await 的智能提示、类型推导支持远优于 yield
- 打包工具和静态分析(如 TypeScript)能更好识别 async 函数的返回类型和可能抛出的错误
- 团队协作时,新人更容易理解 await user = fetchUser() 这样的写法,而非理解生成器执行器如何调度
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











