当前位置: 首页 > 面试题库 >

下文Promise的执行顺序是怎样的?

终祯
2023-03-14
问题内容

作者:HappyLittleFish

new Promise((resolve,reject)=>{
    console.log("1")
    resolve()
}).then(()=>{
    console.log("2")
    new Promise((resolve,reject)=>{
        console.log("3")
        resolve()
    }).then(()=>{
        console.log("4")
    }).then(()=>{
        console.log("5")
    }).then(()=>{
        console.log("6")
    }).then(()=>{
        console.log("7")
    })
}).then(()=>{
    console.log("8")
    Promise.resolve().then(()=>{
        console.log(9)
    }).then(()=>{
        console.log(10)
    })
}).then(()=>{
    console.log("11")
}).then(()=>{
    console.log("12")
})

问题答案:
new Promise((resolve, reject) => {
  console.log("1")
  resolve()
}).then(
  () => {
    console.log("2")
    new Promise((resolve, reject) => {
      console.log("3")
      resolve()
    }).then(
      () => {
      console.log("4")
    }).then(
      () => {
      console.log("5")
    }).then(
      () => {
      console.log("6")
    }).then(
      () => {
      console.log("7")
    })
  }
).then(
  () => {
  console.log("8")
  Promise.resolve()
  .then(
    () => {
    console.log(9)
  }).then(
    () => {
    console.log(10)
  })
}).then(
  () => {
  console.log("11")
}).then(
  () => {
  console.log("12")
})
// 第二行Promise被创建后自动运行,打印 "1" ,后续执行resolve进入第五行箭头函数
// 第六行打印 "2" ,后续创建新Promise对象
// 第七行Promise被创建后立即执行,代码进入第八行,打印 "3" ,后续执行resovle进入第十一行箭头函数
// 第十二行打印 "4" 完成,没有resolve强制执行下个任务进入同步任务队列,回过头来执行第一个Promise的then函数
// 第二十五行箭头函数执行,打印 "8" ,继而执行Promise.resolve,强行插队回到第二个Promise的第二个then十三行中(第一个then被强制resolve)
// 第十四行箭头函数执行,打印 "5" ,回到原始队列,继续执行第一个Promise,代码进入二十八行
// 第二十九行箭头函数执行,打印 "9",第二十四行到三十四行内为第一个Promise的一个then行为,没有resolve,下个任务继而计入同步队列,执行三十五行的下一个then
// 第三十六行箭头函数执行,打印 "11" ,进行下一个异步前需要清空同步队列,现在在同步队列中的任务有第十六行和第二十四行
// 根据同步队列顺序,第十六行then方法先执行,执行十七行箭头函数,打印 "6" ,然后没有resolve强制执行下个任务进入同步队列
// 继续根据同步队列顺序第二十四行then继续执行,前部分已完成,直接进入第三十一行,第三十二行执行箭头函数,打印 "10" ,该同步队列清空,继续下一个异步
// 第三十九行箭头函数执行,打印 "12",进行下一个异步前摇清空同步队列,同步队列中还剩十九行
// 根据同步队列顺序,第二十行箭头函数执行,打印 "7",同步队列完成清空
// 进入下一个异步,Promise闭合,异步队列完成清空,函数执行完毕
// 故函数打印顺序为 1->2->3->4->8->5->9->11->6->10->12->7
 类似资料:
  • 本文向大家介绍一文告诉你Sql的执行顺序是怎样的,包括了一文告诉你Sql的执行顺序是怎样的的使用技巧和注意事项,需要的朋友参考一下 学过 Sql,或了解过 Sql 的人,应该都会写下面这行代码: 上面代码表示查询 t 表中的所有信息,是 Sql 查询中最基础,最简单的一行代码,你可以把它理解成是其他编程语言中的Hello World。 select *只是你迈入 Sql 大门的第一步,在真实工作中

  • 本文向大家介绍setTimeout和Promise的执行顺序?相关面试题,主要包含被问及setTimeout和Promise的执行顺序?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先我们来看这样一道题: 输出答案为2 10 3 5 4 1 要先弄清楚settimeout(fun,0)何时执行,promise何时执行,then何时执行 settimeout这种异步操作的回调,只有主线程

  • 我实现了以下promise函数,比如 cart.getbasket(req) Cart.UpdateBasket(req) Cart.UpdateDefaultShipport(req) cart.GetBasketObject(basket) 当前我执行代码时使用 我读过关于的文章,并想把它用作逻辑的流程,但当我使用时,它并不像预期的那样工作,因为我看到each的

  • 本文向大家介绍请问css/html/js/img的下载顺序是怎样的?都是并发执行的吗?相关面试题,主要包含被问及请问css/html/js/img的下载顺序是怎样的?都是并发执行的吗?时的应答技巧和注意事项,需要的朋友参考一下 应该是按照html内容的先后顺序加载吧 css/js默认是阻塞式加载 img是异步加载 所以默认情况下应该只有img是并发执行的 另外,可通过script标签的async属

  • 关于 promise reduce执行顺序 请高手解释下为何p1和p2为什么都是打印1,p1和p2都在runPromiseInSequence之前执行 这是我尝试修改后的代码, 看起来还是比较吃力,求大佬帮我解析一下,问了chatgpt回答的不正确

  • 打印2的位置 怎么解释呢