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

Promise.all()中能否同时使用多个.finally()和多个.catch()?

关于你提出的两个问题解答如下:


1. 给Promise.all入参的每个Promise单独加.finally(),同时在链式末尾加.finally()的写法完全合法

.finally()的核心特性是:无论Promise最终是fulfilled还是rejected都会执行回调,并且执行完成后会透传原Promise的状态和结果,返回一个新的Promise。
你代码里给p1、p2分别加的.finally(),会在对应单个Promise执行结束时立即触发,不需要等其他Promise完成,适合做单个任务的独立清理逻辑(比如单个请求的状态重置、资源释放);而Promise.all末尾的.finally(),会等所有入参Promise都成功完成,或是任意一个入参Promise失败导致Promise.all整体reject时才触发,适合做批量任务的统一收尾逻辑。
这种写法不仅合法,还是实际开发中很常用的分层处理逻辑。

2. Promise.all完全支持搭配多个.catch()使用

Promise链式调用的规则是通用的,不管调用链上游是普通Promise还是Promise.all返回的实例,都可以挂载任意多个.then/.catch/.finally:

  • 多个.catch会按链式调用的顺序依次执行,前一个.catch如果没有抛出新的错误,后续的链式调用会正常往下走
  • 如果Promise.all因为任意入参Promise失败触发reject,错误会按顺序传递给链式调用上的每一个.catch处理

你的测试代码修正版(补全了闭合符号):

var p1 = new Promise((resolve, reject) => {
  resolve('p1');
});

var p2 = new Promise((resolve, reject) => {
  resolve('p2');
});
Promise.all([
  p1.finally(() => { console.log("p1 completed"); }),
  p2.finally(() => { console.log("p2 completed"); }),
]).then(values => {
  console.log(values[0]);
  console.log(values[1]);
}).finally(() => {
  console.log("all() completed");
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:15:01