我目前有以下代码:
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
中的原因。
答案 0 :(得分:2)
请参阅Handling errors in Promise.all
Promise.all
是全有还是全无。一旦阵列中的所有承诺都解决,它就会解决,或者一旦其中一个拒绝,就立即拒绝。换句话说,它要么使用所有已解析值的数组进行解析,要么使用单个错误进行拒绝。
您可以编写一些代码,例如-
Promise.all([promise1, promise2]).then(r => console.log(r)).catch(e => console.log(e));
这可能是解决问题的方法,请参见https://stackoverflow.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));
答案 1 :(得分:0)
来自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]);
})();