并行承诺的自定义错误处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并行承诺的自定义错误处理相关的知识,希望对你有一定的参考价值。

我有一组要通过Promise.all并行执行的承诺。我也想忽略错误,如果有的话,通过:

Promise.all(promises.map(p => p.catch(() => undefined)));

我试图了解undefined的返回在这里有何帮助(我可以返回错误吗?)。如果我想要基于状态码的更多自定义逻辑,是否可以进行以下工作?

Promise.all(promises.map(p => p.catch(error => {
    if (error.statusCode === 400) return error;
    throw error;
})));

我只想忽略状态码为400的那些错误,但保留其他所有内容的原始行为。

答案

您的处理方式:

const results = await Promise.all(promises.map(p => p.catch(error => {
  if (error.statusCode === 400) return error;
  throw error;
})));

...将正常工作,只要使用results的代码知道它将接收结果和错误对象的混合。版本:

const results = await Promise.all(promises.map(p => p.catch(() => undefined)));

...导致每种错误情况下results数组的值均为undefined。您要做什么取决于您希望结果看起来像什么。

另一答案

是的,这应该有效。 catch(fn)的语义是:

  • 如果fn返回一个值,则使用该值解决承诺。 (除非返回的值本身就是被拒绝的承诺,但是这里不是这种情况。)
  • 如果fn引发异常,则该诺言将被该异常拒绝。

如果从catch处理程序返回错误,则Promise.all可能会返回包含成功值和错误的数组。

以上是关于并行承诺的自定义错误处理的主要内容,如果未能解决你的问题,请参考以下文章

片段内的自定义列表不起作用

找到我的自定义代码片段 Xcode 6?

片段中的自定义列表适配器

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

使用 fetch 和 ES6 承诺处理自定义错误的最简洁方法

*可能的未处理承诺拒绝(id:0):类型错误:未定义不是对象(评估'result.cancelled')云图像上传