generator函数通过yield暂停执行,next()恢复并可传值,throw()抛错、return()终止;for...of仅自动遍历,不支持传值与异常控制。

Generator 函数通过 yield 暂停执行,用 next() 方法逐步恢复,本质是手动控制函数的“暂停-继续”节奏。
yield 是暂停点,不是返回值终点
yield 表达式会让函数暂停,并把右侧的值(如 yield 1 中的 1)作为 next() 调用的返回结果中的 value。函数真正暂停的位置在 yield 表达式**执行完之后**,下一次 next() 才从该位置继续。
- 第一次调用
next():执行到第一个yield,暂停,返回{ value: ..., done: false } - 后续每次
next():从上一个yield暂停处继续,直到下一个yield或函数结束 - 函数返回(包括隐式返回
undefined)后,再调用next()都会返回{ value: undefined, done: true }
next() 可以向 generator 传入值
next(value) 的参数会成为**上一个 yield 表达式的返回值**。这是实现双向通信的关键。
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function* g() {
const x = yield 'a';
console.log(x); // 第二次 next(123) 传入的 123 会到这里
yield 'b';
}
-
it.next()→ 返回{ value: 'a', done: false },函数停在yield 'a'后 -
it.next(123)→x = 123,继续执行,打印123,然后遇到yield 'b'暂停
throw() 和 return() 主动干预流程
除了 next(),还可以用其他方法中断或终止 generator:
-
it.throw(error):在暂停位置抛出错误,如果 generator 内有try...catch可捕获;未捕获则中止 -
it.return(value):立即结束 generator,返回{ value: value, done: true },忽略后续yield
注意:return() 不会触发 finally 块(如果有),而 throw() 会——这点和普通函数一致。
for...of 自动遍历,但忽略传值能力
for...of 会自动调用 next() 直到 done: true,适合只读场景:
function* nums() { yield 1; yield 2; yield 3; }
for (const n of nums()) console.log(n); // 1 2 3
但它**无法传入值给 yield**,也不响应 throw() 或 return()。需要精细控制时,必须显式使用迭代器对象和 next() 等方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










