Generator 是 JavaScript 中可暂停和恢复执行的特殊函数,天然适合作为迭代器实现,支持按需取值、中止操作、自定义迭代协议及异步流程协同,核心价值在于显式控制迭代节奏。

Generator 是 JavaScript 中一种特殊的函数,它能暂停和恢复执行,天然适合作为迭代器的底层实现,让开发者对“何时取值、取多少、是否中断”拥有精细控制权。
让迭代过程可暂停、可恢复
普通函数一旦开始执行就会一直运行到结束,而 generator 函数通过 function* 声明,内部用 yield 标记暂停点。每次调用返回迭代器的 next() 方法,函数只执行到下一个 yield 就暂停,并返回当前值和状态。
- 适合处理大数据流:比如逐行读取大文件、分页拉取 API 数据,避免一次性加载全部内容
- 可随时中止:调用迭代器的 return() 或 throw() 能提前退出,清理资源
- 多次调用 next() 相当于“按需推进”,不触发多余计算
自然实现自定义迭代协议
JavaScript 的 for...of、扩展运算符(...)、Array.from() 等都依赖对象的 [Symbol.iterator] 方法。Generator 函数默认返回符合该协议的对象,因此可直接用于这些语法。
- 无需手动实现 next()、done、value 属性,generator 自动提供标准迭代器接口
- 可轻松封装复杂逻辑:如遍历树结构、生成斐波那契数列、模拟异步队列等
- 配合 yield* 可委托另一个 generator,实现迭代逻辑复用
与异步流程协同更清晰
虽然 async/await 更常用于异步操作,但 generator 结合 Promise 仍能构建可中断、可调试的异步控制流(如早期 co 库的原理)。它把“等待异步结果”的时机显式暴露在 yield 处。
立即学习“Java免费学习笔记(深入)”;
- 每个 yield 后可接 Promise,由外部 runner 决定如何处理(等待、并发、超时)
- 错误可统一在 generator 外捕获,或用 yield 后跟 try/catch 分段处理
- 比嵌套回调或长链 .then() 更易理解执行节奏
注意边界:不是万能替代,需明确使用意图
Generator 本质是同步可暂停函数,不能直接 await yield 表达式(除非配合 runner)。它擅长的是“控制迭代节奏”,而非简化异步写法本身。
- 若只需简单遍历数组,用 for...of 或 map/filter 足够,不必引入 generator
- 若逻辑涉及大量异步等待且无暂停需求,async/await 更直观
- 调试 generator 时,注意调用 next() 才会真正执行代码,断点可能不会在函数入口触发
Generator 的核心价值,在于把“迭代”从隐式行为变成显式可控的过程——你决定什么时候走一步,什么时候停,什么时候丢弃剩下的。这种掌控感,在流式处理、状态机、协程式编程中尤为关键。


















