猿问

ES6 generator的yield问题

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}的型式


慕后森
浏览 413回答 3
3回答

一只名叫tom的猫

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
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答