ES6生成器函数通过function*和yield实现分段执行,本质是可暂停恢复的迭代器;每次调用next()才执行到下一个yield或return,返回{value, done}对象;for...of自动遍历yield值但忽略return值;需配合执行器与Promise结合实现异步控制流。

ES6 生成器函数通过 function* 和 yield 关键字实现代码的分段执行,本质是创建一个可暂停、可恢复的迭代器对象。
生成器函数的基本写法
用 function* 声明生成器函数,内部用 yield 暂停执行并返回值。每次调用 next() 方法才会继续执行到下一个 yield 或函数结束。
-
yield后面的表达式会在调用next()时求值,不是定义时求值 -
next()返回形如{ value: ..., done: true/false }的对象 - 函数体外无法直接访问内部状态,只能靠迭代器控制执行节奏
手动控制执行节奏
生成器不自动运行,必须显式调用 next() 触发每一段逻辑:
function* countdown(n) {
while (n > 0) {
yield n;
n--;
}
return "done";
}
<p>const iter = countdown(3);
console.log(iter.next()); // { value: 3, done: false }
console.log(iter.next()); // { value: 2, done: false }
console.log(iter.next()); // { value: 1, done: false }
console.log(iter.next()); // { value: "done", done: true }每次 next() 都让函数从上次暂停处继续,直到下一个 yield 或 return。
立即学习“Java免费学习笔记(深入)”;
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
用 for...of 自动遍历(忽略 return 值)
for...of 会自动调用 next(),但只遍历 yield 出的值,跳过 return 的终值:
- 适合只需要中间产出值的场景
- 如果需要捕获
return值,必须手动调用next() - 遇到
throw或return时循环自动终止
配合 Promise 实现异步分段执行
生成器本身不处理异步,但可与 Promise 结合,用 yield 标记异步断点,再由执行器(如 co 或手写 runner)驱动:
function* fetchUser() {
const user = yield fetch('/api/user');
const posts = yield fetch(`/api/posts?uid=${user.id}`);
return { user, posts };
}关键在于外部执行器:它接收 yield 出的 Promise,等待 resolve 后再调用 next(result) 把结果传回生成器内部。
不复杂但容易忽略:生成器不是线程,没有并发能力;它的“分段”是协作式控制流,依赖调用方主动推进。

















