script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
代码执行步骤:
1.同步代码优先执行:
console.log('script start'):直接输出 script start。
调用 async1(),进入 async1 函数:
console.log('async1 start'):输出 async1 start。
遇到 await async2(),暂停 async1 的执行,先执行 async2。
进入 async2 函数:
console.log('async2'):输出 async2。
async2 执行完毕,返回一个 Promise,await 会让出控制权,将 async1 的剩余部分放入微任务队列。
继续执行同步代码:
new Promise 的构造函数是同步的,所以 console.log('promise1'):输出 promise1。
resolve() 将 Promise 的状态改为 fulfilled,将其 then 回调放入微任务队列。
console.log('script end'):输出 script end。
2.微任务队列执行:
微任务队列中有两个任务:
async1 中 await 之后的代码:console.log('async1 end')。
Promise 的 then 回调:console.log('promise2')。
按照微任务的先进先出原则:
先执行 console.log('async1 end'):输出 async1 end。
再执行 console.log('promise2'):输出 promise2。
3.宏任务队列执行:
宏任务队列中有一个任务:
setTimeout 的回调:console.log('setTimeout')。
执行 console.log('setTimeout'):输出 setTimeout。