Generator 提供暂停/恢复能力,是协程的“骨架”而非“引擎”,需配合调度器(如 Promise + next() 或 co 库)实现协作式并发;其本质为单线程交替执行,适用于异步 I/O 流程编排,不支持 CPU 密集型并行。

Generator 本身不直接实现协程并发,但它提供了暂停/恢复执行的能力,配合调度器(如手动控制或 Promise 驱动)可以模拟协程式并发行为——即多个任务交替执行、看似并行,实则单线程协作式调度。
Generator 是协程的“骨架”,不是“引擎”
Generator 函数返回一个迭代器对象,调用 next() 会执行到下一个 yield 并暂停,把控制权交还给调用方。这种可中断、可恢复的特性,正是协程的核心特征。但它不自动调度,也不处理异步等待;要形成“并发效果”,必须由外部逻辑(调度器)统一管理多个 Generator 的执行时机。
用 Promise + next() 手动驱动实现协作式并发
把异步操作包装成 Promise,让 Generator 在 yield 后暂停,等 Promise settle 后再调用 next() 恢复。多个 Generator 可以交错执行,比如:
- Generator A yield 一个 fetch 请求 → 暂停
- 调度器立即启动 Generator B,yield 一个定时器 → 暂停
- 当 fetch 完成,调度器 resume A;同时定时器到期,resume B
这样两个任务在宏观上“同时进行”,实际是事件循环穿插推进,无阻塞、无竞态,符合协程语义。
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
用 co 或自写 runner 简化调度逻辑
像 co 这类库封装了自动执行逻辑:它接收 Generator 函数,内部递归调用 next(),遇到 Promise 就用 .then() 链式恢复,遇到普通值直接继续。你只需写类似同步的代码:
function* main() {
const a = yield fetch('/api/a').then(r => r.json());
const b = yield fetch('/api/b').then(r => r.json());
return [a, b];
}co 会按需启停多个这样的 Generator,实现“并发请求+顺序消费”的混合效果——这正是协程并发的典型场景。
注意:这不是真正的多线程并发
JavaScript 主线程仍是单线程,Generator 协程之间不会抢占式切换,也不会并行计算。所有 yield 都是主动让出控制权,调度完全协作式。这意味着:
- 一个 Generator 若执行 CPU 密集型同步代码(如长循环),会阻塞整个调度器
- 并发效果只对异步 I/O(fetch、setTimeout、Promise 等)有效
- 错误需通过 throw() 注入 Generator 内部,需配合 try/catch 处理
真正需要高并发吞吐时,仍应结合 Web Worker 或服务端分流;Generator 协程更适合组织复杂异步流程、避免回调嵌套、提升可读性。

















