async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
setTimeout(() => {
console.log("timer1");
}, 0);
}
async function async2() {
setTimeout(() => {
console.log("timer2");
}, 0);
console.log("async2");
}
async1();
setTimeout(() => {
console.log("timer3");
}, 0);
console.log("start");
// async1 start => async2 => start => async1 end => timer2 => timer3 => timer1
// 首先运行async1函数,打印【async1 start】,然后遇上await async2()同时函数内await后的内容进入微队列,执行async2(),async2中计时器timer2进入宏队列,打印【async2】,之后跳出async1函数,执行外部同步函数,timer3进入宏队列,打印【start】,此时微队列中是async1中await async2之后的内容,所以打印【async1 end】,timer1进入宏队列,微队列内容执行完毕之后开始执行宏队列内容,从头开始分别打印【timer2、timer3、timer1】
//所以打印顺序[async1 start]\[async2]\[start]\[async1 end]\[timer2、timer3、timer1]
宏任务和微任务的定义
宏任务是由宿主环境(如浏览器或Node.js)发起的任务,它们通常包括一些IO操作、定时器事件(如setTimeout和setInterval)、UI渲染等。宏任务会在每一轮事件循环的开始被处理。
微任务则是由JavaScript引擎内部发起的任务,它们通常是在当前执行栈中的任务执行完毕后立即执行。微任务的例子包括Promise的回调、MutationObserver的回调等。微任务的执行时机早于宏任务,它们会在当前执行栈为空后,下一个宏任务执行前被处理。