co模块是Generator函数的自动执行器,通过递归调用next配合Promise驱动,统一处理Promise、数组、对象、thunk等yield值,并捕获异常实现错误兜底。

co 模块的核心作用是让 Generator 函数像 async/await 一样自动执行异步流程,它通过“递归调用 next” + “Promise 驱动”完成对 yield 后异步操作的接管和结果传递。
co 如何启动并接管 Generator 执行
co 接收一个 Generator 函数(或其返回的遍历器对象),立即调用 gen.next() 获取第一个 { value, done }。关键在于:如果 value 是 Promise、thunk 或可被 co 转为 Promise 的值(如数组、对象),co 就会等待它 settle;否则直接把 value 作为下一次 next() 的参数传入。
- co 内部封装了一个
onFulfilled回调,每次 Promise resolve 后,用其返回值调用gen.next(value) - 若新返回的
result.done === true,整个流程结束,co 返回的 Promise 以result.valuefulfill - 若仍为
done: false,则继续对新的result.value做 Promise 化和等待,形成循环
co 对不同 yield 值的标准化处理
co 不要求你 yield 的必须是原生 Promise。它内置了适配逻辑,统一转为 Promise:
- Promise 实例:直接 await(在 Promise 链中 .then)
-
普通对象或数组:调用
co递归处理(支持并发:对象 key 并行、数组元素并行) -
thunk 函数:调用它并传入
(cb) => cb(err, result)形式的回调,再包装为 Promise - 基本类型或 null/undefined:直接 resolve,不等待
错误传播与 try/catch 的对应关系
Generator 内部抛出异常,或 yield 的 Promise reject,都会被 co 捕获,并导致 co 返回的 Promise reject。这使得你可以用外部的 .catch() 统一处理整个 Generator 流程中的任意错误:
立即学习“Java免费学习笔记(深入)”;
- yield 一个 reject 的 Promise → co 触发
onRejected→ 调用gen.throw(err) - Generator 内部 throw →
gen.throw()调用失败 → co 返回的 Promise reject - 因此,在 Generator 里写
try...catch可捕获同步错误或前一步 yield 的异常,而外层co(gen).catch(...)是兜底
为什么 co 是“自动执行器”而不是语法糖
co 本身不改写代码,也不依赖编译。它的“自动”体现在:完全由 JavaScript 运行时控制流实现——利用 Generator 的暂停/恢复语义 + Promise 的状态通知机制,手动模拟了类似 async 函数的执行模型。它比手写 gen.next().value.then(...) 链更简洁,但底层仍是显式调用 next 和 throw,没有魔法。
本质上,co 是一个精巧的、基于 Promise 的 Generator 协程调度器。



















