generator函数通过yield定义暂停点,next()触发恢复并可传值,throw()和return()提供异常处理与强制终止功能。

Generator 函数通过 yield 关键字实现暂停,通过调用迭代器的 next() 方法触发恢复。它不是靠手动“控制”暂停点,而是由函数体内的 yield 语句定义暂停位置,每次 next() 调用后执行到下一个 yield 或函数结束。
yield 是暂停的唯一入口
函数体内遇到 yield 表达式时,立即暂停执行,并把 yield 后面的值作为 next() 返回结果的 value。此时函数上下文(包括变量、作用域、执行位置)被保留。
- 第一次调用
next()才开始执行,直到遇到第一个yield就停住 - 后续每次调用
next()都从上一个暂停处继续,运行到下一个yield或return -
yield可以出现在任意嵌套层级(如 if、循环、函数调用中),只要执行流到达它,就暂停
next() 是恢复执行的唯一方式
调用 next() 不仅恢复执行,还能向函数体内传入值——该值会成为上一个 yield 表达式的返回结果(即赋给 yield 左侧的变量)。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
gen.next():启动或继续,返回{ value: ..., done: false/true } -
gen.next(value):把value传入函数,作为前一个yield的返回值 - 例如:
let x = yield 1;,下次调用next(5)时,x就等于5
throw() 和 return() 提供额外控制路径
除了 next(),还可以用 throw() 向暂停处抛出错误,或用 return() 强制结束生成器并返回指定值。
-
gen.throw(err):在暂停位置 throw 错误,可被内部try...catch捕获 -
gen.return(value):立即终止生成器,返回{ value, done: true },忽略后续yield - 一旦
done: true,再调用next()、throw()、return()都只返回{ value: undefined, done: true }
实际暂停/恢复的典型流程示例
以一个计数器为例:
function* counter() {
let i = 0;
while (true) {
yield i++;
}
}
const gen = counter();
console.log(gen.next()); // { value: 0, done: false }
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
每次 next() 都让函数从上次暂停处恢复,执行一次循环体,遇到 yield 再暂停,形成“一拍一动”的节奏。










