【发布时间】: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