promise的链式调用顺序

promise的then的链式调用顺序不是按照先后顺序的吗?为什么以下代码的顺序有点不一样?

new Promise((resolve,reject)=>{
    console.log("promise1")
    resolve()
}).then(()=>{
    console.log("then1-1")
    new Promise((resolve,reject)=>{
        console.log("promise2")
        resolve()
    }).then(()=>{
        console.log("then2-1")
    }).then(()=>{
        console.log("then2-2")
    })
}).then(()=>{
    console.log("then1-2")
})
/*
运行结果:
promise1
then1-1
promise2
then2-1
then1-2
then2-2
*/ 

同样的,我的问题也就是:第一个外层的then的状态是什么情况下,第二个外层的then才会调用呢?

阅读 3.7k
3 个回答

1、外层promise1执行,打印promise1,把then1-1追加到microtasks,此时microtasks为[then1-1]
2、外层then1-1中的回调函数执行,打印then1-1,此时microtasks为[]
3、内层promise1执行,打印promise2,把then2-1追加到microtasks,此时microtasks为[then2-1]
4、外层then1-1执行结束,把then1-1追加到microtasks,此时microtasks为[then2-1, then1-2]
5、内层then2-1中的回调函数执行,打印then2-1,把then2-2追加到microtasks,此时microtasks为[then1-2, then2-2]
6、外层then1-2中的回调函数执行,打印then1-2,此时microtasks为[then2-2]
7、内层then2-2中的回调函数执行,打印then2-2,此时microtasks为[]

  1. 第1行的Promise被创建,它的构造函数里面的函数会立即执行,此时输出promise1
  2. 第2行的resolve方法被调用,因此会接着执行第4行的then里面的内容,此时输出then1-1;第14行的then里面的内容会进入任务队列,等待执行。
  3. 第6行的Promise被创建;同理,此时输出promise2
  4. 第8行的resolve方法被调用,因此会接着执行第9行的then里面的内容,此时输出then2-1;第12行的then里面的内容会进入任务队列,等待执行。
  5. 此时同等级别的任务队列里面有两个任务,分别是步骤2里面提到的第14行的then回调和步骤4提到的第12行的then回调,根据先后顺序,分别先后执行输出then1-2then2-2
1. new Promise((resolve,reject)=>{
2.   console.log("promise1")
3.   resolve()
4. }).then(()=>{
5.   console.log("then1-1")
6.   new Promise((resolve,reject)=>{
7.     console.log("promise2")
8.     resolve()
9.   }).then(()=>{
10.    console.log("then2-1")
11.  }).then(()=>{
12.    console.log("then2-2")
13.  });
14. }).then(()=>{
15.   console.log("then1-2")
16. })
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏