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

使用Promise.all时如何仅获取指定2个已决议Promise的返回值

问题说明

已知可以通过数组解构结合Promise.all的写法简化并行Promise的取值:

const [result2, result3] = await Promise.all([p2, p3]);

现有如下代码场景,仅需要获取其中2个Promise的返回值,需要改造代码达到同等简洁效果:

// array of other Promises
this.allAwaitingPromises = [p1, p4];

await Promise.all(this.allAwaitingPromises);
const result2 = await p2();
const result3 = await p3(); 
改造方案

根据实际业务的执行顺序要求,选择对应写法即可:

场景1:所有Promise可并行执行,不需要等p1、p4完成再触发p2、p3

直接把所有Promise合并到同一个Promise.all调用中,数组解构时用空位跳过不需要取值的项即可,是最简洁的实现:

this.allAwaitingPromises = [p1, p4];
// 前两个空位对应不需要取值的p1、p4返回结果
const [, , result2, result3] = await Promise.all([
  ...this.allAwaitingPromises,
  p2(),
  p3()
]);

如果觉得空位可读性差,也可以用对象解构的方式避免位置记错的问题:

this.allAwaitingPromises = [p1, p4];
const { result2, result3 } = await Promise.all([
  ...this.allAwaitingPromises,
  p2().then(val => ({ result2: val })),
  p3().then(val => ({ result3: val }))
]).then(list => Object.assign({}, ...list));

场景2:业务要求必须等p1、p4全部完成后,才能执行p2、p3

这时候不要把所有Promise合并,否则p2、p3会和p1、p4并行启动,不符合执行顺序要求,只需要把原来分开await p2、p3的部分改成Promise.all结合解构的写法即可:

this.allAwaitingPromises = [p1, p4];

await Promise.all(this.allAwaitingPromises);
// 直接替换原来两行单独await的逻辑
const [result2, result3] = await Promise.all([p2(), p3()]);

注意:给出的示例代码里p2、p3是带括号调用的,说明二者是返回Promise的函数,传入Promise.all时不要漏写括号,否则会把函数本身而非Promise对象传入,导致逻辑异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:27:26