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
总结:
以后遇到此类问题,能执行的任务先执行,不能立刻执行的任务分类,分为宏任务和微任务,相信下次就不会再出错了。