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