EventLoop中的async和await

直接先来看一道题:

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('setTimeout0')
}, 0)
setTimeout(function() {
  console.log('setTimeout3')
}, 3)
setImmediate(() => console.log('setImmediate'))
process.nextTick(() => console.log('nextTick'))
async1()
new Promise(function(resolve) {
  console.log('promise1')
  resolve()
  console.log('promise2')
}).then(function() {
  console.log('promise3')
})
console.log('script end') 

按照“正常”的理解 一般会认为输出结果为:

script strat                        但实际上的结果为:script strat
async1 start               async1 start
async2                  async2
*async1 end               promise1
promise1                 promise2
promise 2                script end
script end                   nextTick
nextTick                  async1 end
promise 3                  promise3
setTimeout0                 setTimeout0
setImmediate               setImmediate
setTimeout3                 setTimeout3 

问题的关键就在于怎么理解为什么 async2 之后输出的不是 async1 end 而是promise1。

这里我直接说下个人理解的结论,

1.async函数会返回一个promise对象

2.async函数遇到await,时执行完await的任务后会先返回,等到await表达式中的 Promise 解析完成后继续执行 async 函数并返回解决结果

3.await表达式中的 Promise 解析完成是指await时会向本轮循环的微任务队列中添加一个空的promise回调,待回调完成即代表Promise 解析完成

根据上述三点再来看问题中的代码。

 

 

至于其他的细节可以参考这篇文章:http://www.inode.club/node/event_loop.html#%E8%AF%A6%E7%BB%86%E8%AE%B2%E8%A7%A3

posted @ 2022-09-18 19:03  grigeorge  阅读(48)  评论(0编辑  收藏  举报