Open hushicai opened 5 years ago
标准文档是把async/await作为一个promise语法糖。
v8按照标准文档,底层是用promise实现了async/await.
babel是把async/await转换为generators和promises,再通过regenerator-runtime把generator转换为Es5代码。
chakra同babel类似,底层用generators和promises实现了async/await.
正如fast-async中提到,v8 7.2去掉了PromiseResolveThenableJob
,改成了promiseResolve
,所以新旧版本chrome的async/await的执行结果可能不同。
按照标准文档,当一个Promise跟随另外一个Promise状态时,例如new Promise(resolve=>resolve(p))
,就会向微任务队列中加入一个PromiseResolveThenableJob
。
而Promise.resolve(p)
则不同,它会直接返回追随的Promise。
例如:
const p = Promise.resolve(42);
const promise = new Promise(resolve => resolve(p));
此时便会向微任务队列中加入一个PromiseResolveThenableJob
。
按照标准文档,PromiseResolveThenableJob
伪代码应该长这样:
const p = Promise.resolve(42);
const promise = new Promise(resolve => {
p.then(v => resolve(v);
});
执行PromiseResolveThenableJob
微任务时,p.then
又会安排一个PromiseReactionJob
。
这里有一个关于async/await的坑: microtask queue got me singin' the blues
https://tc39.github.io/ecma262/#await
https://www.zhihu.com/question/39571954/answer/82042148
https://hackernoon.com/async-await-generators-promises-51f1a6ceede2
https://v8.dev/blog/fast-async
https://v8.js.cn/blog/fast-async/