生成器函数混淆返回值

时间:2018-09-19 07:28:57

标签: javascript ecmascript-6 generator

我阅读了有关生成器函数的信息,我认为它与async await大致相同,但是预期结果与实际结果不同。

function* adding() {
  var result = 1 + 1
  return 20 + (yield result)
}

var sum = adding()
console.log(sum.next()) // not returning 22 but 2?
console.log(sum.next(10)) // where is 30 come from?

1 个答案:

答案 0 :(得分:2)

yield关键字暂停生成器功能。首次调用.next()时,解释器将遍历生成器,直到遇到第一个yield。生成器将在此处暂停,并将yield之后的表达式返回给.next()的调用者。因此,由于result从2开始,所以yield result导致第一个.next()调用返回2。

当您使用表达式调用.next()时,该表达式将替换为上次暂停的yield所在的生成器函数。因此,当调用.next(10)时,此行在这里:

return 20 + (yield result)

变成

return 20 + (10)

因为10是传递给.next()的东西。因此,最后将返回20 + 10,即30。

如您所见,生成器与async / await 完全不同,尽管它们都处理控制异步程序流。