Eventloop面试题

243 阅读1分钟
async function fn1(){
  console.log(1);
  await fn2().then(console.log)
  console.log(2);
}

function fn2(){
  return new Promise((resolve,reject)=>{
    console.log(3);
    resolve(4);
    console.log(5);
  })
}

console.log(6)

setTimeout(()=>{
  console.log(7)
},0);

fn1();
console.log(8)

这段代码的执行流程: 首先会执行了console.log(6)打出6,把setTimeout加入宏任务,接着调用f1()函数,此时会执行console.log(1)在控制台打出1,接着遇到await 函数,先将console.log加入微任务,去执行f2()函数,接着打印console.log(3),接着执行resolve(4),这意味着f1()函数中fn2().then执行完毕,此时把console.log(2)加入微任务,到此f1()函数执行完毕,执行console.log(8),最后按顺序把微任务的代码运行,接着在运行宏任务,整段代码结束。

最终答案:

6
VM84:2 3
5
8
4
2
7

总结:

以后遇到此类问题,能执行的任务先执行,不能立刻执行的任务分类,分为宏任务和微任务,相信下次就不会再出错了。