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