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

Promise链中then/finally/catch返回的Promise是同步还是异步创建?

Promise链中后续Promise的创建时机

结论很明确:Promise链中通过then()/finally()/catch()生成的新Promise(比如你示例里的promise2、promise3、promise4),会在调用这些方法时同步创建,完全不需要等到对应的回调函数执行。

具体解释

当你调用promise1.finally()时,不管promise1当前是resolved、rejected还是pending状态,这个方法会立刻返回一个新的Promise实例(即promise2),同时把你传入的回调函数注册到promise1的回调执行队列中。

同理,紧接着调用promise2.then()时,会立刻创建promise3;调用promise3.catch()时,会立刻创建promise4。这些新Promise的初始状态都是pending,它们的最终状态会依赖于前一个Promise的状态,以及对应回调函数的执行结果,但它们的创建过程是同步完成的,和回调是否执行没有关系。

代码验证

你可以给示例代码添加同步日志,直观看到创建时机:

let promise1 = Promise.resolve('Stackoverflow');
console.log('创建promise1后');

const promise2 = promise1.finally(() => {
  console.log('finally()回调执行');
});
console.log('promise2已创建:', promise2);

const promise3 = promise2.then((data) => {
  console.log('Data: ' + data);
});
console.log('promise3已创建:', promise3);

const promise4 = promise3.catch((rejection) => {
  console.log('rejection: ' + rejection);
});
console.log('promise4已创建:', promise4);

运行后日志顺序如下:

创建promise1后
promise2已创建: Promise { <pending> }
promise3已创建: Promise { <pending> }
promise4已创建: Promise { <pending> }
finally()回调执行
Data: Stackoverflow

从日志能清晰看到:promise2、3、4在finally()和then()的回调执行前就已经存在,只是初始状态为pending。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:22:19