为什么 3 后面不是 2 呢 ?

新手上路,请多包涵
  async function async1() {
    await async2()
    console.log('2')
  }

  function async2() {
    console.log('3')
  }

  async1()

  new Promise(function (resolve) {
    console.log('6')
    resolve()
  }).then(function () {
    console.log('7')
  })

结果:3 - 6 - 2 - 7
请问,为什么 3 后面不是 2 呢?

阅读 1.6k
2 个回答

async只是语法糖,本质还是promise,你转换下就理解了

  function async1() {
    async2().then(() => console.log('2'))
  }

  function async2() {
    console.log('3')
        return Promise.resolve()
  }

  async1()

  new Promise(function (resolve) {
    console.log('6')
    resolve()
  }).then(function () {
    console.log('7')
  })

而且这个也不难理解,等待async2执行那可不就是先3后2吗,不然await的意义在哪

async1是一个异步函数,在其内部遇见了await就相当于需要等到async2resolve了之后才会继续往下执行,接着开始执行async2内的同步代码,打印3,然后把async2的resolve后执行的任务(也就是此时还没resolve)插到消息队列中,再继续执行下一个Promise执行器函数中的同步代码,也就是打印6,再把这个promise落定后执行的任务插入到消息队列中,此时同步代码都执行完了,开始微任务处理,然后把async2resolve后的任务出列执行,打印2,接着把promise.resolve落定后执行的任务出列执行,把promise.then()的任务插入消息队列,最后把这个任务出列执行,打印7

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题