hushicai / hushicai.github.io

Blog
https://hushicai.github.io
27 stars 1 forks source link

async/await #31

Open hushicai opened 5 years ago

hushicai commented 5 years ago

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/

hushicai commented 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.

hushicai commented 5 years ago

理解 JavaScript 的 async/await

hushicai commented 5 years ago

正如fast-async中提到,v8 7.2去掉了PromiseResolveThenableJob,改成了promiseResolve,所以新旧版本chrome的async/await的执行结果可能不同。

hushicai commented 5 years ago

按照标准文档,当一个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

hushicai commented 5 years ago

「前端面试题系列1」今日头条 面试题和思路解析

hushicai commented 4 years ago

这里有一个关于async/await的坑: microtask queue got me singin' the blues