generator函数通过yield实现双向传递:yield向外输出值,next(value)向内传入值;首次next()传参被忽略;throw()和return()也可移交控制权。

Generator 函数通过 yield 实现暂停与恢复,而“双向传递”指的是:既可从 Generator 向外输出值(yield 表达式),也可从外部向 Generator 内部传入值(调用 next(value) 时传入的参数)。控制权在调用方和生成器之间交替切换,关键在于理解 yield 表达式的返回值和执行时机。
yield 表达式本身有返回值
yield 不是语句,而是表达式——它会暂停执行,并把右侧值返回给调用方;当下一次调用 next() 时,传入的参数会成为当前 yield 表达式的计算结果。
例如:
function* counter() {
let a = yield 1; // 暂停,向外返回 1;a = 下次 next(x) 的 x
console.log('a:', a); // a: 100
let b = yield 2 + a; // 暂停,向外返回 2 + a;b = 再下次 next(y) 的 y
return b * 10;
}
<p>const gen = counter();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next(100)); // { value: 102, done: false } → a 被赋值为 100
console.log(gen.next(200)); // { value: 2000, done: true } → b 被赋值为 200,return 触发</p>第一次 next() 无法接收传入值
Generator 启动时,执行到第一个 yield 前,尚未进入“可接收输入”的状态。因此首次调用 next(value) 时,传入的值会被忽略(规范要求)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 这是设计使然:初始状态没有对应的
yield等待接收 - 若需初始化参数,建议在函数参数中显式声明,或用
gen.next({ init: xxx })作为约定(但该值仍不会被赋给第一个 yield)
throw() 和 return() 也会触发控制权移交
除了 next(),Generator 还支持主动中断流程:
-
gen.throw(error):在暂停位置抛出错误,相当于在yield处执行throw error,可被内部try...catch捕获 -
gen.return(value):立即结束 Generator,返回{ value, done: true },跳过后续yield
两者都会将控制权交还给 Generator 内部逻辑,实现更灵活的协同控制。
实际协作模式:类似协程通信
Generator 常用于模拟协程、处理异步流程(如早期 co 库)、或构建状态机。核心是“等待 → 接收 → 处理 → 输出 → 等待”循环:
- 外部调用
next()驱动执行,同时传入上一步结果 - Generator 内部用
yield暂停,等待下一步输入 - 每轮
yield既是出口(返回值),也是入口(接收下个next()的参数)
这种机制让 Generator 成为天然的“双向通道”,比单纯迭代器更富表现力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










