异步题

看下面的代码,执行后依次输出什么

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 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。