如何使用 Promise.all 解构动态数量的异步调用的结果

Bri*_*etz 5 javascript es6-promise

我需要通过 并行进行未知数量的异步调用Promise.all。与此类似的东西:

let externalCalls = [call1()];
if (someCondition1) {
  externalCalls.push(call2());
}
if (someCondition2) {
  externalCalls.push(call3());
}
Run Code Online (Sandbox Code Playgroud)

然后externalCalls将被传递到,Promise.all以便它们可以并行运行。

理想情况下,我想使用结果的解构,以便我可以按名称引用结果,即

const [call1, call2, call3] = await Promise.all(externalCalls);
Run Code Online (Sandbox Code Playgroud)

我知道call1它会永远在那里,但我不知道是否call2call3将会在那里。所以我想定义动态const调用的结果await Promise.all以获得正确的属性,这可能吗?或者我是否有一个长度未知的通用结果数组,然后必须检查结果中的每个项目以查看哪个调用产生了它?

ᆼᆺᆼ*_*ᆼᆺᆼ 2

一方面,您已经知道基于 等调用了.push()哪些externalCalls调用someCondition1

但也许最好以externalCalls不同的方式构建,这样它总是具有相同的长度:

const conditions = [true, someCondition1, etc]
const calls = [call1, call2, etc]
const externalCalls = conditions.map(
  (c, i) => c ? calls[i]() : Promise.resolve(null))
const [result1, result2, etc] = await Promise.all(externalCalls)
Run Code Online (Sandbox Code Playgroud)