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