Generator 实现双向数据通信,核心在于 yield 表达式既能输出值又能接收外部传入的值,依赖 next(value) 将 value 作为上一个 yield 的返回值;yield 是暂停点与数据接口,首次 next() 不可传参,后续调用可驱动状态更新与响应循环。

Generator 实现双向数据通信,核心在于 yield 表达式既能向外输出值,也能接收外部传入的值。这依赖于 next() 方法的参数传递机制:调用 gen.next(value) 时,value 会作为上一个 yield 表达式的返回值,从而让 Generator 内部逻辑感知外部输入。
yield 是“暂停点”,也是“数据接口”
每次执行到 yield,函数暂停并返回一个 { value, done } 对象;下一次调用 next() 时,执行继续,并把传入的参数赋给当前 yield 所在表达式的结果。
function* gen() { const x = yield 'hello'; console.log(x); }- 第一次
gen().next()→ 返回{ value: 'hello', done: false },执行停在yield 'hello' - 第二次
it.next('world')→'world'赋给const x,接着执行console.log(x),输出'world'
用 next() 和 yield 配合完成请求-响应循环
常见于协程式异步控制(如早期 co 库)、状态机、或与外部系统交互的场景。关键在于设计好 yield 的“提问点”,并在外部根据返回值决定传什么。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- Generator 内部 yield 出一个描述性对象(如
{ type: 'fetch', url: '/api/user' }) - 外部执行器捕获该对象,发起真实请求,拿到结果后调用
it.next(result) - Generator 恢复执行,
yield表达式得到result,继续后续逻辑
手动模拟一个简单的双向通信例子
比如一个计数器,外部可随时注入新起始值:
function* counter() {
let n = 0;
while (true) {
// yield 当前值,并等待外部传入新起点(若传了就重置)
const reset = yield n;
if (reset !== undefined) n = reset;
else n++;
}
}
<p>const it = counter();
it.next(); // { value: 0, done: false }
it.next(); // { value: 1, done: false }
it.next(100); // { value: 100, done: false }
it.next(); // { value: 101, done: false }
</p>
注意边界:首次 next() 无法传参
规范要求第一次调用 next() 传参会被忽略(因为还没走到任何 yield 等待接收)。所以初始化逻辑应放在函数开头,或用 it.next() 启动后再通信。
- 想让第一次就接收数据?可在 Generator 开头加一个无意义的
yield占位,或改用it.next(undefined)显式启动 - 避免在未检查
done: true时继续调用next(),否则返回{ value: undefined, done: true }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










