一道经典的考察事件循环、宏任务、微任务的js题
一道经典的考察事件循环、宏任务、微任务的js题
async function async1(){ console.log(async1 start) await async2() console.log(async1 end) } async function async2(){ console.log(async2) } console.log(script start) setTimeout(function(){ console.log(setTimeout) },0) async1(); new Promise(function(resolve){ console.log(promise1) resolve(); }).then(function(){ console.log(promise2) }) console.log(script end)
先上正确答案:
那为什么答案是这样的呢?
第一步肯定是打印script start这不用说;
第二步执行到setTimeout时,它是一个宏任务,它会等当前宏任务全部执行完毕后再执行;
第三步执行到async1函数时,会先打印出async1 start,然后打印出async2,因为async定义的函数会立即执行,async2会返回一个promise的微任务进入回调队列线程;
第四步执行到new Promise时,会打印出promise1,同样resolve()会返回一个微任务进入回调队列线程;
第五步就打印出script end,到此时同步的都已经执行完毕,然后主线程会去回调队列线程拉任务;
第六步主线程拉到第一个任务是async2返回的一个promise,又会碰到一个resolve(),这时又将其推入回调队列线程;
第七步拉到new Promise的resolve(),这时会打印出promise2;
第八步就是打印出async1 end;
第九步就是当前宏任务执行完毕,执行下一个宏任务setTimeout,打印出setTimeout;