前言
这几天一直在复习准备找新工作,又有了些新的认识,谈一下我对Promise执行顺序的看法
- promise的构造器函数是同步执行的。
- 当promise实例的状态为fullfilled的时候,才会将then的回调函数压入微队列
- 每一个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
- 将计时器的回调 T1 压入宏队列
- 创建了一个Promise P2,同步执行P2的构造器函数,打印4。执行到resolve(5),P2的状态变为fullfilled,将 t2 压入微队列
- P2 在主线程中已经结束了,执行定时器将 T2 压入宏队列
- 打印10主线程此时结束,此时队列情况:宏(T1,T2) 微(t2),此时已打印:1 ,4 ,10
- 微队列有任务先将微队列的t2拿到主线程来执行,resolve(5)传递的值为5所有打印5;
- 此时又新建了一个fullfilled状态的 P3。这时就有两个fullfilled状态的promise P2 和 P3。
- 多个fullfilled状态的promise会按照执行顺序依次将 then 的回调函数压入微队列。
- t2执行时定义了fullfilled状态的P3,先执行到了 t3 ,所有会先将t3压入微队列
- 这里是重点,此时主线程还没空,t3 入列之后 t2 就结束。t2 后依有then,会将这个then的回调 t5 压入微队列,主线程空
- 此时队列情况:宏(T1,T2) 微(t3,t5),此时已打印:1,4,10,5
- t3 执行打印6,将 t4 入微队列,此时微队列:t5 ,t4
- t5 执行打印11,将 t6 入微队列,此时微队列:t4,t6
- t4 执行打印7,将 T3 压入宏队列。t4 后面没有then了,没东西入微队列,此时微队列:t6 ;宏队列:T1,T2,T3
- t6 执行打印12,此时微队列空,此时已打印:1,4,10,5,6,11,7,12
- T1 执行打印2,新建了一个fullfilled状态的 P1,将 t1 入微队列,此时队列情况:宏(T2,T3) 微(t1)
- t1 执行打印3,微队列空
- T2 执行打印9
- T3 执行打印8
所有最终的结果:1,4,10,5,6,11,7,12,2,3,9,8
以上就是我对Promise执行顺序的理解,如果有什么不对的地方欢迎交流讨论