面试时的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 | // 输出 |