如果承诺失败,请抓住但继续下一个

时间:2019-03-30 17:58:15

标签: javascript promise async-await

我目前有以下代码:

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中的原因。

2 个答案:

答案 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]);
})();