面试时的EventLoop/Promise
难度进阶
版本一:得心应手版
1 | setTimeout(()=>{ |
考察点:了解宏任务(marcotask
)微任务
版本二:游刃有余版
1 | setTimeout(()=>{ |
考察点:Promise的理解程度
版本三:炉火纯青版
首先理解一下以下执行(这个更好理解)
1 | // 题1 |
1 | // 输出 |
then
返回的promise
要等该then
注册的回调执行完才resolve
按我能现在接受的理解是:new Promise(fn)
,fn
毫无疑问是立即执行的,(resolve
是异步),之后所有then
同步执行完,返回Promise{<pending>}
,(期间注册回调,注意不是放到microqueue
中,只是放到promise
的callback
属性中)每个promise
都在等待resolve
后变为fulfilled
才把注册的回调microtask(fn)
,立刻放到微任务队列中,如此循环。
1 | // 题2 |
1 | // 输出 |
1 | // 题3 - 检验上面的理解 |
做到心中有队列(current stack 和 micro stack一直在):
1 | // 题4 |
1 | // 输出 |
版本四:登峰造极版
考点:在
async/await
之下,对Eventloop
的影响
槽点:别被
async/await
给骗了,这题不难。
1 | async function async1() { |
1 | // 输出 |
这里该题作者给的解释:
await async2()
相当于一个Promise
,console.log("async1 end");
相当于前方Promise
的then
之后执行的函数
此处唯一有争议的就是async
的then
和promise
的then
的优先级的问题
1 | async function async1() { |
1 | // 输出 |