JavaScript生成器中的yield return值的解析

时间:2015-04-02 21:32:57

标签: javascript generator ecmascript-6

如果我为生成器上的next方法提供值,除了yield关键字右侧提供表达式之外,返回值如何? yield已解决?

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}

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

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

2 个答案:

答案 0 :(得分:2)

有两种方法可以解释"返回收益率的价值"。

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

或者你可能意味着传递给yield的值,这是有效的"返回"来自生成器的next方法。您的代码段并未真正揭示这一点。尝试:

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值,这将是value的{​​{1}}。

答案 1 :(得分:2)

  

根据输出,它是提供给下一个方法的值,该值用于表达式返回到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 }