你对 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中文网其他相关文章!