当我想将数组变量作为参数传递时,如何使用Promise.all()

时间:2017-10-19 13:10:36

标签: javascript es6-promise

我使用Promise.all()时出现问题。

我想将一个数组变量作为参数传递给Promise.all(),如下所示。

const promArr = []
if (condition1) {
  promArr.push(() => prom1(arg1, arg2))
}
if (condition2) {
  promArr.push(() => prom2(arg1, arg2))
}
if (promArr.length > 0) Promise.all(promArr)

但即使条件都是真的,上面也不会运行promise函数(prom1prom2)。 (promArr.length就像我预期的那样)

如果我将承诺函数直接推送到promArr,我担心它们会在那时被推送到promArr,而不是Promise.all(promArr)

在这种情况下如何正确使用Promise?

2 个答案:

答案 0 :(得分:2)

使用promArr变量就可以了。然而(顾名思义),它应该是一个promises数组,而不是一个返回promises的函数数组。

const promArr = []
if (condition1) {
  promArr.push(prom1(arg1, arg2))
}
if (condition2) {
  promArr.push(prom2(arg1, arg2))
}
return Promise.all(promArr)
  

如果我将承诺函数直接推送到promArr,我恐怕它们会被推送到promArr,而不是Promise.all(promArr)

Promise.all无法运行任何功能,您必须自己动手。是的,通过在条件块内立即调用prom1prom2,它们将在评估条件后立即开始,但如果它们正确异步并且不会干扰以下内容条件不是问题。请注意,他们还没有等待他们返回的承诺,他们会并行处理。

答案 1 :(得分:0)

根据MDN Promise.all()会返回单个Promise,当可迭代参数中的所有承诺解析后,它将解析[...] < / em>的

尝试推动Promises:

promArr.push(new Promise((resolve, reject) => {
    console.log(p1, p2);
}));

如果我使用你的例子,我得到:

const p1 = 1;
const p2 = 2;
const promArr = [];

if (condition1)
  promArr.push(new Promise((resolve, reject) => {
    console.log(p1, p2);
}));

if (condition2)
  promArr.push(new Promise((resolve, reject) => {
    console.log(p1, p2);
}));

Promise.all(promArr);
  

如果我将承诺函数直接推送到promArr,我担心它们会运行   那时他们被推到promArr,而不是Promise.all(promArr)。

如果你想在Promise.all上运行所有功能,你可以这样做:

const p1 = 1;
const p2 = 2;
const promArr = [];

if (condition1)
  promArr.push(() => prom1(arg1, arg2));
if (condition2)
  promArr.push(() => prom1(arg1, arg2));

Promise.all(promArr.map((prom) => new Promise((resolve) => resolve(prom()))));

这里,.map将函数数组转换为Promise.all()的promises数组。

这有点棘手,但它正在发挥作用。