提问者:小点点

JS promises.all()-如何防止“catch”停止promise链?[副本]


给定一个承诺数组和一个promise.all()语句,如果其中一个承诺失败,整个链将停止(它不等待任何后续承诺的实现),并且promise.all()。catch()激发,但promise.all()。then()不激发。

但是,如果每个承诺都有自己的“catch”块,并且如果导致承诺失败的任何问题都可以在该catch块内修复,那么我们如何防止其余的承诺被忽略/失败,从而使Promises.all()。then()仍然执行呢?是否有某种方法可以从。catch()块中“否定”错误,从而保证。all()看不到它?我尝试在。catch()块的末尾返回promise.resolve(),但它不起作用。

示例:

let promise_array = [];

let p = somePromisyFunction1()
    .then(() => { // Do something good })
    .catch(() => { // Handle the bad });
promise_array.push(p);

p = somePromisyFunction2()
    .then(() => { // Do something good })
    .catch(() => { // Handle the bad });
promise_array.push(p);

p = somePromisyFunction3()
    .then(() => { // Do something good })
    .catch(() => { // Handle the bad });
promise_array.push(p);


// ...
// More Promisy functions added to promise_array here...
// ...

Promise.all(promise_array)
    .then(() => { // We're all done! All promises fulfilled. })
    .catch(() => { // Something went wrong! });

在本例中,如果somePromisyFunctionX()中的任何一个失败,该函数的。catch()子句将执行,然后prisme.all.catch()子句也将立即执行,而不需要等待任何后续承诺的实现。

但是,如果我们可以在单个函数的。catch()子句中修复发生的任何坏事情,那么我们如何防止立即触发promises.all()。catch(),而允许其余的承诺继续执行并实现呢?以某种方式,在。catch()子句中,我们是否可以“否定”错误,从而看起来像是承诺实际上成功地实现了,而不是显得失败了呢?

我可以使用try/catch块在async/await函数中实现这一点,但不确定如何使用。then/.catch来实现这一点。


共1个答案

匿名用户

是的,您只需从失败承诺的捕获中返回一些内容,它将作为承诺中的解决“恢复”。所有

希望这能证明。如果somePromisyFunction2中没有catch,整个链将失败(通过注释掉它来检查),但是有了它,整个链将以恢复的值成功

null

let promise_array = [];

let p = somePromisyFunction1()
    //.then(() => { // Do something good })
   // .catch(() => { // Handle the bad });
promise_array.push(p);

p = somePromisyFunction2()
    //.then(() => { // Do something good })
    .catch((v) => "2 - " + v);
promise_array.push(p);

p = somePromisyFunction3()
    //.then(() => { // Do something good })
    //.catch(() => { // Handle the bad });
promise_array.push(p);


// ...
// More Promisy functions added to promise_array here...
// ...

Promise.all(promise_array)
    .then((v) => { console.log("all good",v) })
    .catch(() => { console.log("something bad") });
    
    
function somePromisyFunction1(){
  return new Promise(resolve => resolve("1"));
}

function somePromisyFunction2(){
  return new Promise((resolve,reject) => reject("oh no something went wrong!"));
}


function somePromisyFunction3(){
  return new Promise(resolve => resolve("3"));
}