起个名怎么这么费劲 2022-04-10 16:45 采纳率: 50%
浏览 47
已结题

javascript中async, await的输出顺序

在快手面试的时候,遇到了让我判断输出顺序的问题。但是async和await机制我一直搞不太懂,上网查阅了很多资料,依然一知半解。求各位指导。
async function bar() {
  console.log(4)
  setTimeout(() => console.log(5), 500)
}

async function foo() {
  console.log(1)
  await bar() // 1 4 3 2 5
  // bar() // 1 4 2 3 5
  console.log(2)
}

foo()
console.log(3)
当给bar()加上await时,程序的输出是1 4 3 2 5,不加await时输出是1 4 2 3 5,不加await我能理解,但是加了await之后的输出我就想不明白了。
执行foo()的时候,先输出1,然后执行bar(),bar整个函数体被放入一个Promise,然后输出4,接下来就不懂为什么会输出3。
求指导。感激不尽。
  • 写回答

3条回答 默认 最新

  • 波 吉 2022-04-10 17:12
    关注

    为了帮助题主理解,我把属于同一个调用时机的放一起讲解,以下讲解只针对加await的情况
    1、同步代码
    第一步先执行同步代码。代码中,1/4/3 属于同步代码。这里为什么4被当做同步代码,后面会提到。其次你提到一点,"bar整个函数体被放入一个Promise" 其实理解还有点偏差,应该是把 await 之后的所有代码,放入一个Promise中,也就是包括 bar()console.log(2)

    2、微任务(也就是题中的 Promise 部分)
    上一步,被await修饰的代码,都被放入一个Promise中。同步代码执行完毕后,开始执行Promise,从题中看,只有 2 是属于Promise之后的内容

    3、宏任务(也就是题中的 setTimeout)
    Promise执行完毕后,轮到 setTimeout 执行,因此输出了5。

    注:至于上方提到的为何4 是属于同步代码,你可以看下如下示例,其中 1/2 都是同步代码,而只有 3 才是 Promise 的异步回调

    console.log(1)
    new Promise((resolve, reject) => {
      console.log(2)
    }).then(() => console.log(3))
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月16日
  • 已采纳回答 6月8日
  • 创建了问题 4月10日

悬赏问题

  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥100 已有python代码,要求做成可执行程序,程序设计内容不多
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答