Javascript 如何在JS中运行并发承诺,然后在没有承诺的情况下等待它们完成。all()?

Javascript 如何在JS中运行并发承诺,然后在没有承诺的情况下等待它们完成。all()?,javascript,node.js,promise,Javascript,Node.js,Promise,所以我需要做一些类似的事情: promiseFunction1().then((result) => { }).catch((err) => { // handle err }); promiseFunction2().then((result) => { }).catch((err) => { // handle err }); .... promiseFunctionN().then((result) => { }).catch((e

所以我需要做一些类似的事情:

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
,因为我不在乎其中一个或全部失败。我需要确保所有的承诺都完成了。另外,
then()
中的回调函数对于每个
promiseFunctionX()
都是非常独特的

我相信这有点微不足道,但我无法理解。我最初的想法是将计数器保持在运行承诺的上限范围内,并在运行承诺时递增,在
finally()中递减。然后我需要一些
异步函数checkIfRunningPromisesAre0()
,但我也不知道如何实现它,因为它看起来像是递归地狱

这是我的样本,但它只是一个嘲笑糟糕执行的材料:

async function RunningPromisesFinished(){
    if(RunningPromises > 0){
        await sleep(2000);
        return await RunningPromisesFinished();
    }else{
        return true;
    }
}

除此之外,Id必须实现异步函数sleep(N)
,几秒钟后递归级别就会很高,这对RAM肯定不好。

收集所有承诺:

  const promise1 = promiseFunction1().then((result) => {
   }).catch((err) => {
     // handle err
   });
然后您可以使用
Promise.all

  await Promise.all([promise1, promise2, /*...*/ ]);
我不能使用诺言,因为我不在乎其中一个或全部失败

你当然可以。在将承诺链返回到解析分支的每个承诺中添加一个
.catch
时,
promise1
将永远不会拒绝,因此
承诺。所有
也永远不会拒绝。

您可以使用以下方法:

allsolited()方法返回一个在 所有给定的承诺要么已解决,要么已被拒绝,并带有 对象数组,每个对象描述每个承诺的结果

由于这是相对较新的,因此大多数浏览器可能还不支持它。这是一个多边形填充:

 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);
 }

当所有的承诺都得到解决时,你的问题就基本解决了。如果你不想做一些例外的事情,就顺其自然吧
createSomePromise().catch(()=>doSomething())
将始终返回一个无法拒绝的承诺(除非您在
catch
处理程序中执行了一些愚蠢的操作)。这意味着你不能使用
承诺的假设是不正确的。这里所有的
都是错误的。谢谢你的快速回复。那么,承诺位置上出现错误并被其catch()消耗的项的结果数组是什么?@michnovka无论您从
.catch
回调返回什么。@michnovka非常有趣,我刚刚看到一篇关于一些v8更新的文章,目前有一个建议,建议使用
Promise.allSettled
方法,一旦所有承诺都得到解决或被拒绝,该方法就会得到解决。直到
Promise.allsolited()
完全实现。是的,我会。但我认为节点10不支持这一点。@michnovka我添加了polyfill