co库是早期自动执行Generator函数的工具,通过封装next()迭代、智能处理Promise/数组/对象/普通值等yieldable类型,并返回Promise来实现类async/await的异步流程控制。

co 库是早期用于自动执行 Generator 函数、处理异步流程的轻量级工具,它利用 Promise 和 yield 配合,让 Generator 成为一种“类 async/await”的写法。虽然现在已被 async/await 广泛取代,但理解 co 的原理对掌握 JavaScript 异步演进和 Generator 机制仍有价值。
co 的核心作用:自动遍历并驱动 Generator
Generator 函数本身不会自动执行,每次调用 next() 才推进一步,并返回 { value, done }。co 的本质就是封装了这个手动迭代过程,并智能处理 yield 后的值:
- 如果
yield后是 Promise,co 等待其 resolve/reject,再把结果传给下一次next() - 如果
yield后是数组或对象(含 Promise),co 会并行执行(类似Promise.all) - 如果
yield后是普通值(如数字、字符串),co 直接将其作为next(value)的参数传入
基本使用方式:传入 Generator 函数,返回 Promise
co 接收一个 Generator 函数(或返回 Generator 的函数),返回一个 Promise。成功时 resolve 最终 return 值,失败时 reject 抛出的错误。
示例:
立即学习“Java免费学习笔记(深入)”;
const co = require('co');
<p>function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}</p><p>co(function* () {
console.log('start');
yield delay(1000);
console.log('after 1s');
const res = yield Promise.resolve('done');
return res;
}).then(console.log); // 输出: start → (1s 后) after 1s → done
处理异步操作:支持多种 yieldable 类型
co 支持 yield 后跟以下类型,自动转换为 Promise:
- Promise:原生 Promise,直接 await
-
Array:如
yield [fetch('/a'), fetch('/b')]→ 并行请求,结果为数组 -
Object:如
yield { a: fetch('/a'), b: fetch('/b') }→ 并行执行,结果为同结构对象 - Generator 函数 / Generator 实例:递归执行子 Generator(需 co 内部支持,v4+ 默认启用)
- thunk(已过时):co v3 支持,但现在推荐统一用 Promise
错误处理:try/catch + Promise catch 双保险
Generator 内部可直接用 try/catch 捕获 yield 抛出的错误(如 Promise reject);外部也可链式调用 .catch():
co(function* () {
try {
yield Promise.reject(new Error('Oops'));
} catch (err) {
console.error(err.message); // 'Oops'
}
}).catch(err => console.error('Uncaught:', err));
注意:未被内部 catch 的错误会冒泡到返回的 Promise,必须处理,否则可能静默失败。


















