【发布时间】:2017-07-20 21:28:30
【问题描述】:
在阅读async 和await 时,我注意到它几乎等同于生成器函数。考虑this fragment from TypeScript Deep Dive:
异步等待
(...)
// Not actual code. A thought experiment async function foo() { try { var val = await getMeAPromise(); console.log(val); } catch(err) { console.log('Error: ', err.message); } }(...)
生成的 JavaScript
您不必了解这一点,但如果您阅读过生成器,这将相当简单。函数
foo可以简单封装如下:const foo = wrapToReturnPromise(function* () { try { var val = yield getMeAPromise(); console.log(val); } catch(err) { console.log('Error: ', err.message); } });
wrapToReturnPromise只是执行生成器函数以获取generator,然后使用generator.next(),如果值为promise,它将then+catch承诺并取决于结果致电genertor.next(result)或genertor.throw(error)。就是这样!
它最终成为“新功能”的原因是什么?恕我直言,仅使用某个库中的 wrapToReturnPromise 函数也一样好,同时不会增加 JavaScript 本身的复杂性。
注意:它与this question 有关,但这里我问的是“为什么”,而不是“如何”。我试图理解动机。
【问题讨论】:
-
wrapToReturnPromise很复杂(并且经常实现错误/过于幼稚)并且会产生不必要的开销。引擎可以更好地推理和优化async function和await。 -
真正的力量来自拥有both:async generator functions。仅使用生成器语法是不可能的。
-
async/await不是 ES7 (ES2016) 的一部分!它将成为今年发布的 ES2017 的一部分。
标签: javascript async-await generator language-design ecmascript-2017