【问题标题】:Can I error handle await Promise.all with a try-catch block?我可以使用 try-catch 块错误处理 await Promise.all 吗?
【发布时间】:2022-12-20 01:50:34
【问题描述】:

我有以下代码:

但目前没有以任何方式处理错误。用这样的 try-catch 包围那段代码是否正确:

【问题讨论】:

  • 是的,这是正确的做法。 await 将承诺拒绝变成异常。

标签: javascript


【解决方案1】:

try/catch 是从Promise.all 捕获错误的正确方法,但与此同时,一旦只有一个请求失败,它将忽略所有已完成的请求,如果您仍然希望拥有其他成功请求的数据,这并不理想记录错误,所以我建议你使用Promise.allSettled

使用此解决方案,它将保留所有请求,包括失败的请求和成功的请求

const [groupedMeditations, meditationPreferences] = await Promise.allSettled([
   getMeditationsByGroup(),
   getAllPreferences(),
]);

一个可能的结果可以是

[
   {status: "fulfilled", value: "successful value"}, // your 1st request passed
   {status: "rejected",  reason: "Error: an error"} //your 2nd request failed
]

从该响应中,您可以过滤或记录错误

一方面请注意 Promise.allSettled 不适用于 IE,因此您需要 polyfill 来克服它

希望这对您的情况有帮助:D

【讨论】:

  • 那么如果第一个承诺失败,第二个承诺即使没有失败也会失败?
  • 所有响应都按状态分类,Promise.allSettled 没有所谓的失败,所有请求都是分开的(不按顺序)。成功者的状态为fulfilled,失败者的状态为rejected@Bobimaru
  • 所以 Promise.allSettled 让我更容易处理不同的状态,但实际功能是一样的?
  • 是的,这是@Bobimaru
猜你喜欢
  • 2010-09-12
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多