JavaScript 生成器中 yield return 值的分辨率

Resolution of yield return value in JavaScript generators

如果我向生成器上的 next 方法提供一个值, 除了 yield 关键字右侧提供一个表达式之外, yield 的 return 值是如何解决的?

function* go() {
  console.log(yield 'a');
  console.log(yield 'b');
}

var g = go();
g.next();
g.next('one');
g.next('two');

输出:

one
two
Object {value: undefined, done: true}

根据输出,它是提供给下一个方法的值,该值用于 return 由 yield 右侧的表达式编辑的值。

编辑:更新代码以更好地反映我的问题。

有两种解释"return value of the yield"。

你可以指表达式 yield 'a' 的值。正如您从输出中看到的那样,它的值为 one

或者您可以指传递给 yield 的值,它实际上是来自生成器的 next 方法的 "returned"。您的代码片段并没有真正揭示这一点。尝试:

console.log('next1', g.next());
console.log('next2', g.next('one'));
console.log('next3', g.next('two'));

这样您就可以看到生成器输出的值,应该类似于:

"next1", {value: "a", done: false}
"next2", {value: "b", done: false}
"next3", {value: undefined, done: true}

您可以做的另一件事是在生成器函数的末尾添加一个普通的 return 值,这将是 next3value

In light of the output, it is the value supplied to the next method that is used over the value returned by the expression to the right of yield.

提供给 next 方法的值未“用于”yield 右侧的值。提供给 next 的值是 yield 表达式的最终计算结果。总是。 yield 右侧的值是提供给生成器的 消费者 的值。

它是生成器和使用生成器的代码之间的双向通信。

function* go() {
  console.log(yield 'a'); // 'one'
  console.log(yield 'b'); // 'two'
}

var g = go();
console.log(g.next());      // { value: 'a', done: false }       
console.log(g.next('one')); // { value: 'b', done: false }
console.log(g.next('two')); // { value: undefined, done: true }