【问题标题】:Why does ES2017 introduce async/await when ES6 already has generators?当 ES6 已经有了生成器时,为什么 ES2017 引入了 async/await?
【发布时间】:2017-07-20 21:28:30
【问题描述】:

在阅读asyncawait 时,我注意到它几乎等同于生成器函数。考虑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 functionawait
  • 真正的力量来自拥有bothasync generator functions。仅使用生成器语法是不可能的。
  • async/await 不是 ES7 (ES2016) 的一部分!它将成为今年发布的 ES2017 的一部分。

标签: javascript async-await generator language-design ecmascript-2017


【解决方案1】:

乍一看,语法是相似的,您可能会认为代码的行为相似——但有一些关键区别:

  • 说出你的意思function*yield 的含义与 async functionawait 非常不同,类似于 Subclass.prototype = Object.create(Superclass.prototype); Subclass.prototype.constructor = Subclassclass Subclass extends Superclass 的不同之处

  • 运算符优先级await a + await b 可以表示(await a) + (await b),但yield a + yield b 表示yield (a + (yield b))

  • 未来发展async/await 为乐观事务锁定和推测执行的一些真正有趣的工作铺平了道路,因为它们(如本线程所述)是原子性边界的明确标记

  • 其他论点async/await 也有许多反驳论点——including many people that say that generators are just plain 'better' 并且async/await 的方向是错误的。

无耻地从ES discussion site总结。我鼓励您阅读整个主题,因为它对这个主题有一些非常有趣的讨论。

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 2016-04-28
    • 2016-05-12
    • 1970-01-01
    • 2016-07-11
    • 2022-12-02
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多