async/await 本机实现

async/await native implementations

This proposal 建议 async 函数可以在幕后使用生成器函数,尽管我在 ES2017 规范中找不到对此的确认。

此外,当生成器原型在 Chrome/Node.js 中变得混乱时,async 函数似乎没有受到影响,这表明 GeneratorFunction 没有被 AsyncFunction,至少直接:

Object.getPrototypeOf((function * () {}).prototype).next = null;

(async () => {
    return await Promise.resolve(1);
})()
.then(console.log);

async/await 在现有本机实现中究竟如何工作?

这些实现是否比提案建议的通常在 Babel 和 TypeScript 中实现的 Promise/生成器函数方法更高效?

据我所知,生成器函数用于模仿async/await的行为。当您使用 typescript 时,它将被编译为 javascript,并且根据您的设置,它会将 async/await 语法编译为生成器实现。

更多关于编译的信息:https://basarat.gitbooks.io/typescript/docs/async-await.html

所以我认为你根本不应该担心在打字稿中使用它们。

我猜本机实现不使用生成器,它基本上应该只是用于处理 promise 的语法糖。

How exactly does async/await work in existing native implementations?

如果我们查看实际的 native implementation of async await in v8 we can clearly see both promise and generator as the obvious basis of async-await implementation, also in the parser,它清楚地说明了 generator-promise 脱糖的性质 async-await。

关于 ES 规范,尽管该规范没有直接提及执行上下文切换的实际实现,但它暗示了 Perform ! Call(promiseCapability.[[Resolve]] mechanism the Promise.resolve 正在使用的相同用法。因此主观上暗示可能 "mechanism" 来处理 运行 执行上下文切换 asyncContext.

Moreover, when generator prototype becomes messed up in Chrome/Node.js, async functions don't seem to be affected, this suggests that GeneratorFunction isn't used by AsyncFunction, at least directly:

运行时的 generatorasync 函数都是 Function 对象的后代,但它们并不相互继承,这就是为什么你看不到承诺的变化。

但是特定宿主对象或方法的实际本机级实现不一定与已编译对象及其依赖项的运行时执行相关联,就像您不能通过重新分配来改变函数被调用的能力一样Function.prototype.call = () => {},因为 %call% 是原生级别的实现。

Are the implementations more performant than it would be possible with Promise/generator function approach that is suggested by the proposal and is usually implemented in Babel and TypeScript?

这取决于 js 引擎及其实现的编译级优化和反优化,但它会不断变化,有时本机实现比第 3 方库实现慢,如 it happened with es5 map, forEach vs lodash counterparts, but in most cases native level implementation is unmatched due to being one level closer to machine code. As an example here is the 2x prevalence of async-await in jsbench with async-await vs babel regenerator vs promise