Generator本身不执行异步操作,仅提供暂停/恢复机制;co库作为外部执行器,通过递归调用next()配合Promise链自动驱动yield后的异步任务,并统一处理Promise、数组、对象及Thunk等yieldable值,支持错误冒泡与并发控制。

Generator 本身不执行异步逻辑,只提供暂停与恢复的能力。要让它自动跑完一串异步操作(比如 fetch、定时器、数据库查询),必须靠外部执行器驱动——co 库就是这样一个经典且轻量的自动执行器。
co 库的核心作用
co 把你写的 function* 当作一个待调度的任务流,内部用递归 + Promise 链自动调用 .next(),直到 Generator 完全结束或出错。
- 它接收一个 Generator 函数,返回一个 Promise
- 每次
yield后的值(Promise、数组、对象、Thunk)都会被 co 统一处理 - resolve 后把结果传回
.next(value);reject 则抛错,触发 Generator 内的try/catch或外层.catch
怎么用 co 执行异步 Generator
直接传入 Generator 函数,co 返回 Promise,可链式 .then() 或 await:
const co = require('co');
co(function* () {
const res = yield fetch('https://api.example.com/data');
const data = yield res.json();
return data;
})
.then(console.log)
.catch(console.error);关键点:
立即学习“Java免费学习笔记(深入)”;
-
yield后面必须是 thenable 对象(如 Promise)或 co 支持的结构(数组并发、对象并行等) - 不要手动调
gen.next(),co 全包了 - 错误会自动冒泡,Generator 内可用
try/catch捕获单个 yield 失败
co 如何处理不同 yield 值
co 对 yield 后的值做了泛化支持,不只是 Promise:
-
yield Promise→ 等待 resolve/reject,传值或抛错 -
yield [p1, p2]→ 并发执行多个 Promise,按顺序返回结果 -
yield { a: p1, b: p2 }→ 并行执行,返回{ a, b }形式结果 -
yield thunk→ 调用无参函数,期望它返回 Promise(Thunk 模式兼容)
例如:
co(function* () {
const [user, posts] = yield [
fetch('/api/user').then(r => r.json()),
fetch('/api/posts').then(r => r.json())
];
return { user, posts };
});co 的简化原理(一句话)
它本质是一个递归 Promise 驱动器:
- 调一次
.next()→ 得到{ value, done } - 如果
done为 true,resolve 最终value - 否则,对
value(如 Promise)调.then(v => next(v))继续驱动
不需要理解底层,但知道它靠 Promise 链 + 递归 .next() 实现“自动往下走”,就能明白为什么写法像同步、行为却异步。
不复杂但容易忽略


















