【问题标题】:generator function confusion in returned value返回值中的生成器函数混淆
【发布时间】:2019-02-23 07:23:51
【问题描述】:

我阅读了生成器函数,我认为它与异步等待或多或少相同,但预期结果与实际结果不同。

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】:

    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 完全不同,尽管它们都处理控制异步程序流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多