我使用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
就像我预期的那样)
如果我将承诺函数直接推送到promArr
,我担心它们会在那时被推送到promArr
,而不是Promise.all(promArr)
。
在这种情况下如何正确使用Promise?
答案 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
无法运行任何功能,您必须自己动手。是的,通过在条件块内立即调用prom1
和prom2
,它们将在评估条件后立即开始,但如果它们正确异步并且不会干扰以下内容条件不是问题。请注意,他们还没有等待他们返回的承诺,他们会并行处理。
答案 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数组。
这有点棘手,但它正在发挥作用。