javascript - 生成器函数返回值困惑

标签 javascript ecmascript-6 generator

我读到了有关生成器函数的内容,我认为它与 async wait 或多或少相同,但预期结果与实际结果不同。

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?

最佳答案

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

关于javascript - 生成器函数返回值困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52400436/

相关文章:

返回未定义而不是数字的 Javascript 函数

javascript - 滑动框错误

javascript - ES6 导入 – jQuery 未定义

javascript - 如何编写扩展功能组件的 ES6 类 React 组件?

ide - 不接受Webstorm生成器功能

javascript - 语法错误 : Unexpected Identifier (Generators in ES6)

java - 用Java制作一个名称生成器,将生成的字符数量限制为12个,但不会截断单词?

javascript - 难以理解 Node.js 回调

javascript - 什么是真正的多维数组?

javascript - AngularJS : ui. 路由器不显示模板