首页 > web前端 > js教程 > 我们需要 Promise.allSettled() 吗?

我们需要 Promise.allSettled() 吗?

DDD
发布: 2024-11-30 16:47:14
原创
739 人浏览过

Do we need Promise.allSettled()?

你对 Promise.allSettled() 有何看法?

对我来说,allSettled 看起来像是寻找问题的解决方案。这个问题是开发人员不处理错误。

概念

Promise.allSettled() 的设计非常简单:

const allSettled = (promises) => Promise.all(promises.map(entry => entry
  .then((value) => ({ status: 'fulfilled', value }))
  .catch((reason) => ({ status: 'rejected', reason }))
));
登录后复制

它提供了一个“一致”的结果对象 - 嗯,状态是一致的,因此您可以比使用 Object.hasOwn() 更干净地使用 .filter(),但值和原因是故意不同的,因此您不能将它们混淆。

大多数情况下,allSettled 会为您的每个 Promise 添加一个 .catch()。

处理你的错误

但我的症结在于:如果您并行调用一组服务并且您知道一个或多个服务可能会失败,但这并不重要......为什么您不为此编写错误处理?

const getFlakyService = (payload) => fetch(flakyUrl, payload);

Promise.allSettled([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((outcomes) => outcomes
  .filter(({ status }) => status === 'fulfilled'))
});
登录后复制

与此相比,我们节省了多少精力:

const getFlakyService = (payload) => fetch(flakyUrl, payload)
  // We don't really care about the failures
  .catch(() => undefined);

Promise.all([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((data) => { /* ... */ });
登录后复制

如果您关心哪些调用失败,您可能需要可访问的请求信息以进行跟踪,但不能保证该信息在原因中可用。在这种情况下,Promise.allSettled 的帮助就更小了,编写自己的错误处理更有意义。

const getFlakyService = (payload) => fetch(flakyUrl, payload)
  // Send the failures details to a tracking/logging layer
  .catch((error) => trackRequestError(flakyUrl, payload, error);

Promise.all([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((data) => { /* ... */ });
登录后复制

我承认“结果”的标准化可能会很方便。通过 allSettled,您可以在失败全部完成后对失败进行计数。但自定义错误处理也是如此。

结论

在不久的将来我将继续使用 Promise.all(),但我有兴趣了解您对 Promise.allSettled() 的用例以及您为什么喜欢它。

以上是我们需要 Promise.allSettled() 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板