ES6 generator的yield问题

0000
  • 30
function* dataConsumer() {
    console.log('Started');
    console.log(`1. ${yield}`);
    console.log(`2. ${yield}`);
    return 'result';
}

let genObj = dataConsumer();
console.log(genObj.next());// Started

genObj.next('a');// 1. a

// genObj.next('b');//2. b

上述代码输出结果为

Started
{value: undefined, done: false}
1. a
2. b

请问为什么会输出一个 {value: undefined, done: false},
而第二次执行yield则没有返回{value,done}的型式

回复
阅读 1.5k
3 个回答

console.log(genObj.next());这个语句会让dataConsumer在console.log(1. ${yield});这儿停止,而这里yield的返回值是undefined。也就说,实际上是console.log(1. ${yield undefined});所以genObj.next()得到的是{value:undefined,done:false},也就是console.log的输出。而你后来传a给next时没有console.log,所以没打印出来,加个log应该也会打印这个undefined。
我是用手机回答的,可能排版有问题。我的理解是这样的,有问题欢迎指出。

Generatorh函数最大的特点就是可以交出函数的控制权,通过yield实现。在Generator函数的执行中遇到yield命令就会停止执行,并且把yield命令后面表达式的计算值传递到外面。
当想要再次执行Generator函数时,需要使用首次执行Generator函数时返回的迭代器调用next方法实现。这里,有一个点需要注意,也就是,首次调用Generator函数时并不会执行函数内部的逻辑,而是返回一个迭代器,当调用next方法时,才会开始执行内部的逻辑。
在调用next方法时,可以向Generator函数内部传入数据,通过yeild命令的返回值传递,类似这样:
var fromOuter = yeild 'to outer'
这样例子中执行到第一个yield命令时,内部交出控制权,停止执行,因为没有返回值,所以输出结果中的value是undefined,当再次调用next方法时,传入的字符串'a'被yeild返回,输出 1、a。

如果还有什么不懂的可以参考阮一峰的es入门中对Generator函数的讲解。generator

Calling the next() method with an argument will resume the generator function execution, replacing the yield expression where execution was paused with the argument from next().
from: https://developer.mozilla.org...

就是说,如果你调用next方法时附带了参数的话,generator会继续执行,直到下一个yield时停止,这是会把yield表达式换成传入的参数。

你知道吗?

宣传栏