如果承诺失败,抓住但做下一个[重复]

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.allthen(),则不应在没有 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]);
)();

【讨论】:

以上是关于如果承诺失败,抓住但做下一个[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 mocha 的内置承诺支持测试失败的承诺 [重复]

如何重复一系列承诺中的步骤以及如何从失败的步骤中恢复?

未捕获(承诺)错误:请求失败,状态码为500

承诺执行条件

JavaScript承诺 - 多个承诺失败时的逻辑

如何返回一个失败的承诺?