从一道题分析一下async setTimeout Promise

191 阅读1分钟
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

然后碰到async1函数,产生一个函数执行栈,进入到async1函数内部开始执行async1的代码

async1是一个async函数,进入后先打印async1 start,碰到await,执行async2中代码

打印async2,此时async1 end内容并不打印,会讲后续代码放入微任务队列

继续执行全局上下文中的内容,此时碰到setTimeout, 产生宏任务队列中放入匿名函数

碰到promise执行其中的同步代码,然后将then中的内容放入微任务队列,此时微任务中有两个任务等待执行

打印script end

执行完毕,开始执行微任务队列中的任务,采用先进先出原则,所以先执行async1 end,再打印promise2

最后执行宏任务setTimeout