使用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
相关产品推荐
相关产品推荐

