如果承诺失败,抓住但做下一个[重复]
Posted
技术标签:
【中文标题】如果承诺失败,抓住但做下一个[重复]【英文标题】:If promise fails, catch but do the next [duplicate] 【发布时间】:2019-08-21 09:14:49 【问题描述】:我目前有这个代码:
const promise1 = aPromiseCall().then(r => logger(r)).catch(e => logger(e));
const promise2 = anotherPromiseCall().then(r => logger(r)).catch(e => logger(e));
在异步函数中我这样做:
const results = Promise.all([promise1, promise2]);
我这样做是因为我想确保如果 promise1 失败,我仍然可以执行 promise2。但是,我不知道这是否是实现这一目标的最佳方式。我应该在每个承诺中都使用then, catch
,还是有更惯用的方法?
同时我想保证在我继续执行我的代码之前所有的承诺都被解决/拒绝,这就是为什么我把它们放在Promise.all
中。
【问题讨论】:
仅供参考,您在第一行代码的末尾缺少一个额外的)
。
如果您希望将每个承诺的结果传递给 Promise.all
的 then()
,则不应在没有 return
的情况下执行 then()
。您过度简化了用例,因此不清楚期望是什么
@charlietfl 我只是在记录结果/错误。我需要退货吗?我真的不关心在 Promise.all 中做一个 then,我只是使用 Promise.all 来确保所有的承诺都完成了。因为在 Promise.all 之后我做了其他事情,而所有这些承诺都必须在那时完成。
OK....这就是我所说的期望。如果您不需要 Promise.all 中的结果,那么您所做的应该基本上没问题。 catch()
不会抛出传递给它的错误,它会在链上返回一个新的承诺,因此将在 Promise.all 中解决
酷,@charlietfl 你能在你的评论中添加一个答案吗,我认为它解决了我原来的问题。
【参考方案1】:
请参考Handling errors in Promise.all
Promise.all
是全有或全无。一旦数组中的所有承诺都解决了,它就会解决,或者一旦其中一个被拒绝,它就会被拒绝。换句话说,它要么使用包含所有已解析值的数组进行解析,要么以单个错误拒绝。
你可以写一些代码,比如-
Promise.all([promise1, promise2]).then(r => console.log(r)).catch(e => console.log(e));
这可能是问题的解决方案参考https://***.com/a/31524969/3270651-
let a = new Promise((res, rej) => res('Resolved!')),
b = new Promise((res, rej) => rej('Rejected!')),
c = a.catch(e => console.log('"a" failed.'); return e; ),
d = b.catch(e => console.log('"b" failed.'); return e; );
Promise.all([c, d])
.then(result => console.log('Then', result)) // Then ["Resolved!", "Rejected!"]
.catch(err => console.log('Catch', err));
Promise.all([a.catch(e => e), b.catch(e => e)])
.then(result => console.log('Then', result)) // Then ["Resolved!", "Rejected!"]
.catch(err => console.log('Catch', err));
【讨论】:
感谢您的回答,但这并不能真正回答我的问题。即使第一个承诺失败,我也希望执行第二个承诺。 @HommerSmith 它总是执行【参考方案2】:来自MDN:
如果任何元素被拒绝,Promise.all 将被拒绝。为了 例如,如果您传入四个在超时后解决的承诺,并且 一个立即拒绝的承诺,然后 Promise.all 将拒绝 马上。
为了处理可能的拒绝:
const promise1 = aPromiseCall();
const promise2 = anotherPromiseCall();
// In your async function:
const results = await Promise.all([
promise1.catch(error => error),
promise2.catch(error => error),
]);
console.log(results[0])
console.log(results[1])
var promise1 = new Promise((resolve, reject) =>
setTimeout(() => resolve('resolved'), 2000);
);
var promise2 = new Promise((resolve, reject) =>
setTimeout(() => reject('rejected'), 1000);
);
(async function()
const results = await Promise.all([
promise1.catch(error => error),
promise2.catch(error => error),
]);
console.log(results[0]);
console.log(results[1]);
)();
【讨论】:
以上是关于如果承诺失败,抓住但做下一个[重复]的主要内容,如果未能解决你的问题,请参考以下文章