我读了关于生成器函数,我认为它与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?
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
完全不同,尽管它们都涉及控制异步程序流。