给定一个承诺数组和一个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来实现这一点。
是的,您只需从失败承诺的捕获中返回
一些内容,它将作为承诺中的解决“恢复”。所有
希望这能证明。如果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"));
}