yield

**yield** 运算符用于暂停和恢复 生成器函数

试一试

语法

js
yield
yield expression

参数

expression 可选

通过 迭代器协议 从生成器函数生成的返回值。如果省略,则生成 undefined

返回值

返回传递给生成器的 next() 方法以恢复其执行的可选值。

注意:这意味着 next() 是不对称的:它始终将值发送到当前挂起的 yield,但返回下一个 yield 的操作数。传递给第一个 next() 调用的参数无法检索,因为没有当前挂起的 yield

描述

yield 关键字会暂停生成器函数的执行,并且 yield 关键字后面的表达式的值将返回给生成器的调用方。可以将其视为 return 关键字的基于生成器的版本。

yield 只能直接在包含它的生成器函数中使用。它不能在嵌套函数中使用。

调用生成器函数会构造一个 Generator 对象。每次调用生成器的 next() 方法时,生成器都会恢复执行,并运行到它到达以下之一:

  • 一个 yield 表达式。在这种情况下,生成器会暂停,并且 next() 方法返回一个具有两个属性的 迭代器结果 对象:valuedonevalue 属性是 yield 运算符后表达式的值,donefalse,表示生成器函数尚未完全完成。
  • 生成器函数的末尾。在这种情况下,生成器的执行结束,并且 next() 方法返回一个迭代器结果对象,其中 valueundefineddonetrue
  • 一个 return 语句。在这种情况下,生成器的执行结束,并且 next() 方法返回一个迭代器结果对象,其中 value 是指定的返回值,donetrue
  • 一个 throw 语句。在这种情况下,生成器的执行完全停止,并且 next() 方法抛出指定的异常。

一旦在 yield 表达式上暂停,生成器的代码执行将保持暂停状态,直到再次调用生成器的 next() 方法。如果将可选值传递给生成器的 next() 方法,则该值将成为生成器当前 yield 操作返回的值。第一次调用 next() 没有对应的挂起 yield 操作,因此无法获取传递给第一次 next() 调用的参数。

如果调用生成器的 return()throw() 方法,则其作用类似于在暂停的 yield 表达式处执行 returnthrow 语句。可以在生成器函数体中使用 try...catch...finally 来处理这些提前完成的情况。如果调用了 return()throw() 方法,但没有挂起的 yield 表达式(因为尚未调用 next(),或者因为生成器已完成),则无法处理提前完成的情况,并且始终会终止生成器。

示例

使用 yield

以下代码是示例生成器函数的声明。

js
function* countAppleSales() {
  const saleList = [3, 7, 5];
  for (let i = 0; i < saleList.length; i++) {
    yield saleList[i];
  }
}

定义生成器函数后,可以通过构造迭代器来使用它,如所示。

js
const appleStore = countAppleSales(); // Generator { }
console.log(appleStore.next()); // { value: 3, done: false }
console.log(appleStore.next()); // { value: 7, done: false }
console.log(appleStore.next()); // { value: 5, done: false }
console.log(appleStore.next()); // { value: undefined, done: true }

您还可以使用 next(value) 将值发送到生成器中。step 评估为 yield 表达式的返回值——尽管传递给生成器 next() 方法的值在第一次调用 next() 时会被忽略。

js
function* counter(value) {
  while (true) {
    const step = yield value++;

    if (step) {
      value += step;
    }
  }
}

const generatorFunc = counter(0);
console.log(generatorFunc.next().value); // 0
console.log(generatorFunc.next().value); // 1
console.log(generatorFunc.next().value); // 2
console.log(generatorFunc.next().value); // 3
console.log(generatorFunc.next(10).value); // 14
console.log(generatorFunc.next().value); // 15
console.log(generatorFunc.next(10).value); // 26

规范

规范
ECMAScript 语言规范
# prod-YieldExpression

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅