为了账号安全,请及时绑定邮箱和手机立即绑定

ES6 generator的yield问题

ES6 generator的yield问题

慕后森 2019-02-27 14:09:15
function* dataConsumer() {    console.log('Started');    console.log(`1. ${yield}`);    console.log(`2. ${yield}`);    return 'result';}let genObj = dataConsumer();console.log(genObj.next());// StartedgenObj.next('a');// 1. a// genObj.next('b');//2. b上述代码输出结果为Started{value: undefined, done: false}1. a2. b请问为什么会输出一个 {value: undefined, done: false},而第二次执行yield则没有返回{value,done}的型式
查看完整描述

3 回答

?
一只名叫tom的猫

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。 
我是用手机回答的,可能排版有问题。我的理解是这样的,有问题欢迎指出。

查看完整回答
反对 回复 2019-03-15
?
斯蒂芬大帝

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


查看完整回答
反对 回复 2019-03-15
  • 3 回答
  • 0 关注
  • 412 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信