我读到了有关生成器函数的内容,我认为它与 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/