一道有意思并对你有帮助的Promise题

一道有意思的题

以下我的学习分析心路历程,以及我自己又多加了几道菜;希望对你有帮助

先上菜

new Promise((resolve, reject) => {
    console.log('promise1');
    resolve();
}).then(() => {
    console.log('then11');
    new Promise((resolve, reject) => {
        console.log('promise2');
        resolve();
    }).then(() => {
        console.log('then21');
    }).then(() => {
        console.log('then23');
    });
}).then(() => {
    console.log('then12');
});

分析第一道菜

  • 第一次看到我做错了,答案是
promise1
then11
promise2
then21
then12
then23
  • 我的疑惑就是then12为什么在then21then23之间,很奇怪。说明什么呢?我对Promise的内部实现还不了解,那只能去看源码了。在学习过程中,自己也尝试改变了几处,也贴上来吧,大家看看

看完后我的理解

先分析下面代码

new Promise((resolve, reject) => {
    console.log('promise1');
    resolve();
})
  • 第一步console.log('promise1'),这是第一个Promise实例
  • 第二步resolve(),他是一个异步,放入异步队列中,取名异步1
  • 第三步this.status 状态是pending

接着执行下面代码

.then(() => {
    console.log('then11');
    new Promise((resolve, reject) => {
        console.log('promise2');
        resolve();
    }).then(() => {
        console.log('then21');
    }).then(() => {
        console.log('then23');
    });
})
  • 因为状态是pending,将then方法回调函数加入执行队列(一个数组)等待执行(专用来放then方法的数组),该then方法取名方法1

重点接着执行什么?

并不是执行.then(() => {console.log(then12)}),要记住的是then的参数方法执行时机是当前(属于自己的)promise状态改变才会执行,谁改变resolve或者rejectd的执行,那么这里then的promise哪里来,就是上面的方法1中来看他的return值

所以开始执行异步1(我都有取名的,看

相关推荐