generator 和 yield 提供可暂停、可恢复的执行模型,co 利用它将 promise 驱动的异步操作转为同步风格;yield 不处理异步,真正等待由 co 执行器完成,最终实现线性、可调试、可组合的异步流程。

Generator 和 yield 本身不直接实现异步,而是提供了一种“可暂停、可恢复”的函数执行模型;co 模块正是利用这个模型,把异步流程的控制权交还给开发者,让 Promise 驱动的异步操作看起来像同步代码一样自然。这不是语法糖的堆砌,而是一次执行模型的重构。
Generator 是协程在 JS 中的落地
它不是为异步而生,但天生适合异步编排:
- 函数用
function*声明,调用后返回一个迭代器,而非立即执行 - 每次遇到
yield就暂停,并把右侧表达式的值作为{ value, done }返回 -
next()方法可带参数,这个参数会变成上一个yield表达式的返回值,实现内外数据交换 - 它把一个长流程拆成多个“检查点”,每个检查点之间由外部决定何时继续
yield 本身不处理异步,它只是“抛出”任务
关键在于 yield 后面是什么:
- 如果 yield 后是普通值(如
yield 42),那只是暂停并返回数字 - 如果 yield 后是 Promise(如
yield fetch('/api')),Generator 就暂停,并把该 Promise “交出去” - 真正做异步等待的不是 yield,而是外面那个“接住 Promise 并等它兑现后再调 next()”的执行器——也就是 co
co 是 Generator 的自动执行引擎
它抹平了手动调用 next() 的繁琐,把整个流程封装成 Promise 风格:
- 接收一个
function*,内部创建迭代器,反复调用next() - 遇到
yield Promise,就用.then()注册回调,在 Promise 成功后自动传值调next(value) - 支持并行:yield 数组或对象,co 会自动用
Promise.all或Promise.allSettled处理 - 最终返回一个 Promise,成功时 resolve Generator 的 return 值,失败时 reject 错误
它如何开启异步新纪元
在 async/await 出现前,co + Generator 是唯一能写出线性、无嵌套、可调试异步逻辑的方案:
- 告别“回调地狱”,代码结构与执行顺序完全一致
- 错误可统一用 try/catch 捕获(co 内部将 throw 转为 Promise reject)
- 异步流程可复用、可组合、可测试——Generator 本质是描述流程的纯函数
- 它验证了“用同步思维写异步代码”是可行的,直接为 async/await 的设计铺平了道路
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











