3 回答
TA贡献1906条经验 获得超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。
我是用手机回答的,可能排版有问题。我的理解是这样的,有问题欢迎指出。
TA贡献1827条经验 获得超8个赞
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
添加回答
举报