生成函数混淆返回值

问题描述 投票:0回答:1

我读了关于生成器函数,我认为它与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?
javascript ecmascript-6 generator
1个回答
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完全不同,尽管它们都涉及控制异步程序流。

© www.soinside.com 2019 - 2024. All rights reserved.