一道async、await执行顺序的题

69 阅读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')

Promise其实也属于同步代码,跟普通构造函数一样,new的时候会生成对应实例,传的函数会立即执行,而其后续追加着的.then和.catch方法才属于异步代码,会放入微任务队列

async/await成对出现时,async标记的函数会返回一个Promise对象,可以使用then方法添加回调函数。await后面的语句会同步执行。但 await 下面的语句会被当成微任务添加到当前任务队列的末尾异步执行。

我理解的步骤是:

  1. 定义了两个异步函数,async2因为没有相关await,所以当普通函数使用
  2. 打印'script start'
  3. 调用async1,await上面包括后面的代码立即执行,下面的代码放在微任务队列中,打印'async1 start'和'async2',此时微任务队列[console.log('async1 end')]
  4. 将setTimeout放在宏任务队列,最后执行,此时宏任务队列[console.log('setTimeout') ]
  5. new Promise调用函数立即执行,打印'promise1',.then后续方法放入微任务队列,此时微任务队列[console.log('async1 end'),console.log('promise2')]
  6. 打印'script end'
  7. 同步代码执行问题,开始执行队列里的异步代码,执行宏任务之前会检查微任务队列是否有内容,有则依次执行完才执行宏任务,打印'async1 end'和'promise2'
  8. 最后执行宏任务队列,打印'setTimeout',打印结果如下:

image.png

相关原文链接:blog.csdn.net/loveX001/ar…