This proposal建议async
函数可以使用生成器函数,虽然我在ES2017规范中找不到对此的确认。
此外,当生成器原型在Chrome / Node.js中混乱时,async
函数似乎不会受到影响,这表明GeneratorFunction
并未被AsyncFunction
使用{1}},至少直接:
Object.getPrototypeOf((function * () {}).prototype).next = null;
(async () => {
return await Promise.resolve(1);
})()
.then(console.log);
async
/ await
在现有原生实施中的作用究竟如何?
这些实现是否比使用提案建议的Promise
/ generator函数方法更有效,并且通常在Babel和TypeScript中实现?
答案 0 :(得分:14)
async / await在现有本机实现中的工作原理是什么?
如果我们看一下实际的native implementation of async await in v8,我们可以清楚地看到promise和generator都是async-await实现的明显基础,同样在parser它清楚地说明了desugaring的生成器承诺性质异步-AWAIT。
关于ES规范,即使规范没有直接提及执行上下文切换的实际实现,它也提示使用Perform ! Call(promiseCapability.[[Resolve]]
使用的相同Promise.resolve
机制。因此,主观暗示可能的“机制”来处理asyncContext
的运行执行上下文切换。
此外,当生成器原型在Chrome / Node.js中搞砸了,异步函数似乎没有受到影响时,这表明AsyncFunction不使用GeneratorFunction,至少直接使用:
运行时中的generator
和async
函数都是Function
对象的后代,但它们不会相互继承,这就是为什么你看不到提交的更改。
但是,特定主机对象或方法的实际本机级实现不一定必须连接到已编译对应项及其依赖项的运行时执行,就像您不能通过重新分配{{{{{{{{ 1}},因为Function.prototype.call = () => {}
是本机级别的实现。
这些实现是否比使用提案建议的Promise / generator函数方法更有效,并且通常在Babel和TypeScript中实现?
它取决于js引擎及其实现的编译级别优化和去优化,但它会受到持续更改,有时本机实现比第三方lib实现慢,如it happened with es5 map, forEach
vs lodash counterparts,但在大多数情况下,本机级实现由于距离机器代码更近一层,所以是无与伦比的。这里的例子是 2x prevalence of async-await in jsbench with async-await vs babel regenerator vs promise。
答案 1 :(得分:1)
据我所知,生成器函数用于模仿async/await
的行为。当您使用typescript时,它将被编译为javascript,并且根据您的设置,它将编译async/await
语法到生成器实现。
有关此处汇编的更多信息:https://basarat.gitbooks.io/typescript/docs/async-await.html
所以我不应该担心在打字稿中使用它们。
我猜本机实现不使用生成器,它应该基本上只是使用promises的语法糖。