You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于变量存储Promise的同步执行及链式调用的困惑咨询

搞懂这段Promise链式调用的执行逻辑

嘿,我来帮你把这段代码的执行流程拆解得明明白白,再也不困惑~

首先先把你的完整代码贴出来,方便我们一步步分析:

const promise1 = new Promise((resolve, reject) => { 
  setTimeout(() => { 
    resolve('promise 1'); 
  }, 1000); 
}); 
const promise2 = new Promise((resolve, reject) => { 
  setTimeout(() => { 
    resolve('promise 2'); 
  }, 1000); 
});

promise1
  .then(data => { 
    console.log(data); 
    return promise2; 
  })
  // 假设你后续还有这个回调逻辑
  .then(data => {
    console.log(data);
  });

第一步:Promise构造函数的同步执行

当你定义promise1和promise2的瞬间,这两个Promise的构造函数就立刻同步执行了——也就是说,里面的setTimeout会被马上添加到浏览器的定时器队列中,两个定时器都被设定为1000毫秒后触发。此时两个Promise的状态都是pending(等待中)。

第二步:1000毫秒后的宏任务触发

1秒后,两个定时器的回调函数(也就是各自的resolve)会被依次加入到宏任务队列中等待执行:

  1. 先处理promise1的resolve('promise 1'):这会把promise1的状态从pending改成resolved,并且把你注册在promise1.then()里的回调函数,添加到微任务队列中。
  2. 接着处理promise2的resolve('promise 2'):同样把promise2的状态改成resolved,不过这时候还没有任何回调监听它的状态变化,所以暂时没别的动作。

第三步:微任务队列的执行

当当前的宏任务(也就是两个定时器回调)执行完后,事件循环会开始处理微任务队列:

  1. 执行promise1.then()里的回调:先打印出promise 1,然后返回promise2。
  2. 这里的核心知识点:then方法会返回一个全新的Promise。当你在then的回调里返回另一个Promise(也就是promise2)时,这个新Promise会自动等待promise2的状态变化——但此时promise2已经是resolved状态了,所以紧接着,下一个then的回调会被立刻加入微任务队列。
  3. 执行下一个then的回调,打印出promise 2。

额外小测试(加深理解)

如果把promise2的定时器改成2000毫秒,也就是:

const promise2 = new Promise((resolve, reject) => { 
  setTimeout(() => { 
    resolve('promise 2'); 
  }, 2000); 
});

那执行顺序会变成:

  • 1秒后打印promise 1,然后返回promise2,此时promise2还是pending状态。
  • 再等1秒,promise2的resolve触发,状态变成resolved,才会触发下一个then的回调,打印promise 2。

关键总结

  • Promise构造函数是同步执行的,里面的异步操作会立刻启动。
  • then方法返回新的Promise,当返回另一个Promise时,新Promise会“继承”它的状态和结果。
  • 事件循环的顺序:先处理完所有宏任务,再处理微任务;定时器回调属于宏任务,then的回调属于微任务。

内容的提问来源于stack exchange,提问作者Natalia Ivanova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:24:53