我阅读了有关生成器函数的信息,我认为它与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?
答案 0 :(得分: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
完全不同,尽管它们都处理控制异步程序流。