Javascript 当我';我想传递一个数组变量作为参数

Javascript 当我';我想传递一个数组变量作为参数,javascript,es6-promise,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.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函数(
prom1
prom2
)。(
promArr.length
如我所料)

如果我将promise函数直接推送到
promArr
,恐怕它们在运行时被推送到
promArr
,而不是推送到
promise.all(promArr)


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

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

const promArr = []
if (condition1) {
  promArr.push(prom1(arg1, arg2))
}
if (condition2) {
  promArr.push(prom2(arg1, arg2))
}
return Promise.all(promArr)
如果我将promise函数直接推送到
promArr
,恐怕它们在运行时被推送到
promArr
,而不是推送到
promise.all(promArr)

承诺。所有
都不会运行任何函数,您必须自己执行。是的,通过在条件块内立即调用
prom1
prom2
,它们将在条件被评估后立即启动,但是如果它们是正确异步的,并且不干扰以下条件,则这不是问题。请注意,它们返回的承诺尚未等待,它们将并行处理。

根据,
承诺。all()
返回单个承诺,当iterable参数中的所有承诺都已解决[…]时,该承诺将解决

努力推动承诺:

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);
如果我将promise函数直接推送到promArr,恐怕它们会运行 那时,他们被推到promArr,而不是promArr.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()


这有点棘手,但它正在工作。

承诺。所有的
都需要承诺数组,而不是承诺返回函数数组。你为什么要尝试包装它们?你可以(也应该)调用
Promise.all
在空数组上。不需要
if(promArr.length>0)
。我只想使用Promise.all(promArr.then().catch()。.then().catch()在上述情况下有效吗?是的,确实有效(假设您将任何回调传递给
然后
catch
)。清除。非常感谢。谢谢回答。我注意到这个问题很重要,promArr包含Promise.resolve()或Promise.reject(),这与Promise函数何时运行无关。此解决方案适用于promise运行且代码更复杂的情况。所以我选择了更简单的一个。不管怎样,如果在Promise函数运行时问题很重要,这仍然是一个很好的解决方案。干得好