Generator函数的next()方法支持双向通信:首次调用next()传参无效,后续next(x)的x成为上一个yield表达式的返回值,实现参数注入与流程控制。

Generator函数的next()方法不仅可以获取yield表达式的返回值,还能向函数内部“注入”参数——这些参数会成为上一个yield表达式的返回值,从而实现双向通信。
参数如何进入函数内部
调用next(value)时传入的value,不会影响当前yield语句的执行,而是作为前一个yield表达式的计算结果返回。也就是说:第一次next()传参无效(因为前面没有yield可接收),后续每次next(x)中的x,会变成上一轮yield左侧的值。
实际写法示例
看这个典型例子:
function* counter() {
let a = yield 'start';
console.log('a:', a); // 第二次next(10)传入的10会到这里
let b = yield 'middle';
console.log('b:', b); // 第三次next(20)传入的20会到这里
return 'end';
}
<p>const gen = counter();
console.log(gen.next()); // { value: 'start', done: false }
console.log(gen.next(10)); // { value: 'middle', done: false } → 同时打印 a: 10
console.log(gen.next(20)); // { value: 'end', done: true } → 同时打印 b: 20
关键细节注意
- 首次调用
next()不能传参,或传了也忽略(V8引擎会静默丢弃) -
yield表达式本身有返回值,它等于对应next(value)的value - 如果
yield出现在赋值语句右侧(如let x = yield 1),那next()传的值就赋给了x - 函数结束后的
next()调用,参数依然会被忽略(因为已无yield可接收)
常见用途场景
这种传参机制常用于需要外部控制流程的场景:
立即学习“Java免费学习笔记(深入)”;
- 异步流程中传递API响应结果(配合Thunk或Promise封装)
- 状态机:每次
next(action)把用户操作传进生成器,决定下一步状态 - 协程式数据处理:上游推送数据,生成器根据输入动态调整行为


















