Javascript 当我';我想传递一个数组变量作为参数
我在使用Promise.all()时遇到问题 我想将数组变量作为参数传递给Promise.all(),如下所示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)
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函数运行时问题很重要,这仍然是一个很好的解决方案。干得好