一题了解Promise执行顺序,then的回调函数入微队列的顺序

684 阅读2分钟

前言

这几天一直在复习准备找新工作,又有了些新的认识,谈一下我对Promise执行顺序的看法

  1. promise的构造器函数是同步执行的。
  2. 当promise实例的状态为fullfilled的时候,才会将then的回调函数压入微队列
  3. 每一个then的回调函数执行完之后,如何后面还有then,会将对应的回调压入微队列

例题分析:最终输出什么

console.log(1);
  setTimeout(() => { // T1
    console.log(2);
    Promise.resolve().then(() => { //P1 t1
      console.log(3)
    });
  });
  new Promise((resolve, reject) => { //P2
    console.log(4)
    resolve(5)
  }).then((data) => { //t2
    console.log(data);
    Promise.resolve().then(() => { //P3 t3
      console.log(6)
    }).then(() => { // t4
      console.log(7)
      setTimeout(() => { // T3
        console.log(8)
      }, 0);
    });
  }).then(()=>{ // t5
    console.log(11);
  }).then(()=>{ //t6
    console.log(12)
  })
  setTimeout(() => { // T2
    console.log(9);
  })
  console.log(10);

进程分析:

  1. 主进程执行
  2. 打印1
  3. 将计时器的回调 T1 压入宏队列
  4. 创建了一个Promise P2,同步执行P2的构造器函数,打印4。执行到resolve(5),P2的状态变为fullfilled,将 t2 压入微队列
  5. P2 在主线程中已经结束了,执行定时器将 T2 压入宏队列
  6. 打印10主线程此时结束,此时队列情况:宏(T1,T2) 微(t2),此时已打印:1 ,4 ,10
  7. 微队列有任务先将微队列的t2拿到主线程来执行,resolve(5)传递的值为5所有打印5;
  8. 此时又新建了一个fullfilled状态的 P3。这时就有两个fullfilled状态的promise P2 和 P3。
  9. 多个fullfilled状态的promise会按照执行顺序依次将 then 的回调函数压入微队列。
  10. t2执行时定义了fullfilled状态的P3,先执行到了 t3 ,所有会先将t3压入微队列
  11. 这里是重点,此时主线程还没空,t3 入列之后 t2 就结束。t2 后依有then,会将这个then的回调 t5 压入微队列,主线程空
  12. 此时队列情况:宏(T1,T2) 微(t3,t5),此时已打印:1,4,10,5
  13. t3 执行打印6,将 t4 入微队列,此时微队列:t5 ,t4
  14. t5 执行打印11,将 t6 入微队列,此时微队列:t4,t6
  15. t4 执行打印7,将 T3 压入宏队列。t4 后面没有then了,没东西入微队列,此时微队列:t6 ;宏队列:T1,T2,T3
  16. t6 执行打印12,此时微队列空,此时已打印:1,4,10,5,6,11,7,12
  17. T1 执行打印2,新建了一个fullfilled状态的 P1,将 t1 入微队列,此时队列情况:宏(T2,T3) 微(t1)
  18. t1 执行打印3,微队列空
  19. T2 执行打印9
  20. T3 执行打印8

所有最终的结果:1,4,10,5,6,11,7,12,2,3,9,8

以上就是我对Promise执行顺序的理解,如果有什么不对的地方欢迎交流讨论