【问题标题】: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.allthen(),则不应在没有 return 的情况下执行 then()。您过度简化了用例,因此不清楚期望是什么
  • @charlietfl 我只是在记录结果/错误。我需要退货吗?我真的不关心在 Promise.all 中做一个 then,我只是使用 Promise.all 来确保所有的承诺都完成了。因为在 Promise.all 之后我做了其他事情,而所有这些承诺都必须在那时完成。
  • OK....这就是我所说的期望。如果您不需要 Promise.all 中的结果,那么您所做的应该基本上没问题。 catch() 不会抛出传递给它的错误,它会在链上返回一个新的承诺,因此将在 Promise.all 中解决
  • 酷,@charlietfl 你能在你的评论中添加一个答案吗,我认为它解决了我原来的问题。

标签: javascript promise async-await


【解决方案1】:

请参考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));

【讨论】:

  • 感谢您的回答,但这并不能真正回答我的问题。即使第一个承诺失败,我也希望执行第二个承诺。
  • @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]);
})();

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2018-09-07
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多