[英]How to wait for 2 of Promises in Promise.all to finish and then do another task
[英]How to run concurrent promises in JS and then wait for them to finish without Promise.all()?
所以我需要做一些類似的事情:
promiseFunction1().then((result) => {
}).catch((err) => {
// handle err
});
promiseFunction2().then((result) => {
}).catch((err) => {
// handle err
});
....
promiseFunctionN().then((result) => {
}).catch((err) => {
// handle err
});
// WAIT FOR BOTH PROMISES TO FINISH
functionWhenAllPromisesFinished();
我不能使用Promise.all
,因為我Promise.all
一個或全部失敗。 我需要確保所有的承諾都已經完成。 此外, then()
中的回調函數對於每個promiseFunctionX()
都非常獨特。
我相信這有點微不足道,但我無法弄清楚。 我最初的想法是在運行 promise 的上限范圍內保留一個計數器,並在運行時增加它並在finally()
減少它。 然后我需要一些async function checkIfRunningPromisesAre0()
,但我也不知道如何實現它,因為它看起來像遞歸地獄。
這是我的示例,但認為它只是一個嘲笑糟糕實施的材料:
async function RunningPromisesFinished(){
if(RunningPromises > 0){
await sleep(2000);
return await RunningPromisesFinished();
}else{
return true;
}
}
最重要的是,Id 必須實現async function sleep(N)
並且在幾秒鍾內遞歸級別會很高,這肯定對 RAM 不利。
收集所有的承諾:
const promise1 = promiseFunction1().then((result) => {
}).catch((err) => {
// handle err
});
然后你可以對它們使用Promise.all
:
await Promise.all([promise1, promise2, /*...*/ ]);
我不能使用 Promise.all,因為我不在乎其中一個或全部失敗
你肯定可以。 當您向每個承諾添加一個.catch
使承諾鏈回到解析分支時, promise1
永遠不會拒絕,因此Promise.all
也永遠不會拒絕。
您可以使用Promise.allSettled
方法:
Promise.allSettled() 方法返回一個在所有給定的承諾都已解決或被拒絕后解決的承諾,並帶有一個對象數組,每個對象描述每個承諾的結果。
由於這是相對較新的,它可能不被大多數瀏覽器支持。 這是一個polyfill:
function allSettled(promises) {
let wrappedPromises = promises.map(p =>
Promise.resolve(p)
.then(
val => ({ status: 'fulfilled', value: val }),
err => ({ status: 'rejected', reason: err })
)
);
return Promise.all(wrappedPromises);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.