簡體   English   中英

如何在 JS 中運行並發承諾,然后在沒有 Promise.all() 的情況下等待它們完成?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM