generator函数中yield既是表达式(接收next()传入值)又是暂停点,return决定最终value和done;首次next()不传参,后续next(arg)使arg成为上一个yield的返回值。

Generator 函数通过 yield 表达式暂停执行,并天然支持“双向通信”:外部可通过 next() 传入值,内部可通过 yield 返回值;而函数结束时的 return 值也会作为迭代器最终的 value 暴露给调用方。关键在于理解 yield 本身既是**表达式**(可被赋值),又是**暂停点**(控制权移交)。
yield 是表达式,能接收 next() 传入的值
每次调用迭代器的 next(arg),若 Generator 尚未完成,就会把 arg 作为当前 yield 表达式的计算结果返回。注意:首次 next() 传参会被忽略(因无对应 yield 接收)。
例如:
function* counter() {
let step = yield 'start'; // 第二次 next(2) 的 2 赋给 step
console.log('step:', step); // 输出: step: 2
yield step * 2;
}
const it = counter();
console.log(it.next()); // { value: 'start', done: false }
console.log(it.next(2)); // { value: 4, done: false } → yield 表达式返回 2,step=2,yield step*2 返回 4
yield 右侧的值是向外部返回的数据
yield X 执行时,会将 X 作为当前 next() 调用返回对象的 value 字段。这是 Generator 向外“输出”的主要方式。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 如果没写右侧值(如
yield;),则value为undefined - 可以是任意类型:字符串、数字、对象、甚至另一个 Generator(配合
yield*)
return 语句决定最终的 value 和 done
当 Generator 执行到 return value 或自然结束(隐式 return undefined),迭代器返回 { value: ..., done: true }。这个 value 就是最终返回值,可用于收尾通信。
例如:
function* task() {
yield 'working...';
return 'done!';
}
const it = task();
console.log(it.next()); // { value: 'working...', done: false }
console.log(it.next()); // { value: 'done!', done: true }
实际协作模式:请求-响应式流程
常见于异步抽象(如 co 库或手写 runner):外部根据 yield 返回的 Promise(或其他标识)执行异步操作,再将结果用 next(result) 传回,继续后续逻辑。
- Generator 内部:用
let data = yield fetch(...)等待外部 resolve 后传入响应数据 - 外部 runner:捕获
yield出的 Promise,.then(res => it.next(res))推进 - 错误处理:可用
it.throw(err)向内部抛出异常,被try/catch捕获
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










