【问题标题】:JS Promises.all() - how to prevent a 'catch' from stopping the promise chain? [duplicate]JS Promises.all() - 如何防止“捕获”停止承诺链? [复制]
【发布时间】:2020-12-07 15:01:00
【问题描述】:

给定一个 Promise 数组和一个 Promise.all() 语句,如果其中一个 Promise 失败,则整个链停止(它不会等待任何后续 Promise 完成)和 Promise.all().catch () 会触发,但 Promise.all().then() 不会。

但是,如果各个 Promise 有自己的“catch”块,并且如果任何导致 Promise 失败的问题都可以在该 catch 块中修复,那么我们如何防止其余的 Promise 被忽略/失败,所以那 Promises.all().then() 仍然会执行吗?有没有办法从 .catch() 块中“否定”错误,所以 Promises.all() 看不到它?我在 .catch() 块的末尾尝试了return 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() 子句将执行,然后 Promise.all.catch() 子句也将立即执行,而无需等待任何后续承诺兑现。

但是,如果我们可以在单个函数的 .catch() 子句中修复发生的任何坏事,我们如何防止 Promises.all().catch() 立即被触发,而是允许其余的承诺可以继续履行吗?在某种程度上,在 .catch() 子句中,我们可以“否定”错误,因此看起来承诺实际上成功实现了,而不是看起来失败了?

我可以使用 try/catch 块在 async/await 函数中执行此操作,但不确定如何使用 .then/.catch 执行此操作。

【问题讨论】:

  • 您的基本断言不正确。如果您有 .catch() 处理程序,Promise.all() 将不会那样做。
  • Your code seems fine。你能举一个失败的例子吗?
  • Promise.allSettled 只是等待所有承诺解决,无论结果如何。
  • 请告诉我们您的“// Handle the bad*”到底是做什么的,并提供一个minimal reproducible example
  • 也许你实际上在做的是const p = somePromisyFunction1(); promise_array.push(p); p.catch(() => { … });? `

标签: javascript node.js promise


【解决方案1】:

是的,您需要做的就是 return 从失败的承诺中捕获一些东西,它将作为Promise.all 中的解决方案“恢复”

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

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

您也可以选择使用allSettled 而不是all,然后您可以内联处理故障

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.allSettled(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"));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2014-12-29
    • 2017-02-18
    • 2016-01-05
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多