2017-10-19 1013 views
1

我在使用Promise.all()的問題。如何使用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) 

但上面並沒有運行諾言功能(prom1prom2),即使所有條件。 (promArr.length是如我所料)

,如果我直接推諾言功能promArr,我怕他們在那個時候,他們都推到promArr,而不是在Promise.all(promArr)運行。

在這種情況下,我該如何正確使用Promise?

+5

'Promise.all'需要一個承諾數組,而不是一個承諾返回函數數組。你爲什麼試圖包裹它們? – Bergi

+2

您可以(也應該)在空陣列上調用'Promise.all'。不需要'if(promArr.length> 0)'。 – Bergi

回答

2

使用promArr變量就好了。然而(顧名思義),它應該是一組promise,而不是返回promise的一組函數。

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,它們將在條件評估後立即開始,但是如果它們正確異步並且不干擾以下不成問題的條件。請注意,他們返回的承諾尚未等待,他們將同時處理它們。

+0

我只想使用Promise.all(promArr).then()。catch()。 .then()。catch()在上面的情況下有效嗎? – Benjamin

+0

是的,正是(假設你將任何回調傳遞給'then'和'catch')。 – Bergi

+0

清除。 Thx非常。 – Benjamin

0

按照MDNPromise.all()返回解決當所有的在迭代參數的承諾已解決[...]一個承諾。

努力推動公司承諾:

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()。

這有點棘手,但它的工作。

+0

Thx回答。我注意到這個問題很重要,promArr包含Promise.resolve()或Promise.reject(),這與promise函數的運行時間無關。此解決方案適用於承諾運行時,代碼更復雜。所以我選擇更簡單的一個。無論如何,如果Promise函數運行時遇到問題,這仍然是一個很好的解決方案。做得好!! – Benjamin

相關問題