3

在阅读asyncandawait时,我注意到它几乎等同于生成器函数。考虑来自 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(),如果值为 apromise它会then+catch承诺并取决于结果调用genertor.next(result)genertor.throw(error)。而已!

它最终成为“新功能”的原因是什么?恕我直言,仅使用wrapToReturnPromise某个库中的该函数同样好,同时不会增加 JavaScript 本身的复杂性。

注意:它与这个问题有关,但在这里我问的是“为什么”,而不是“如何”。我试图理解动机。

4

1 回答 1

8

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

  • 说出你的意思function*andyield表示与 and 非常不同的东西async functionawait类似于 how Subclass.prototype = Object.create(Superclass.prototype); Subclass.prototype.constructor = Subclassis different fromclass Subclass extends Superclass

  • 运算符优先级:你可以做await a + await b意味着(await a) + (await b),但yield a + yield b意味着yield (a + (yield b))

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

  • 其他论点:也有许多反对论点async/await——包括许多人说生成器只是简单的“更好”,而且async/await方向是错误的。

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

于 2017-03-01T14:10:54.843 回答