首页 > web前端 > js教程 > 如何在异步 JavaScript 中处理所有 Promise,包括被拒绝的 Promise?

如何在异步 JavaScript 中处理所有 Promise,包括被拒绝的 Promise?

DDD
发布: 2024-12-16 12:36:12
原创
333 人浏览过

How Can I Handle All Promises, Including Rejected Ones, in Asynchronous JavaScript?

尽管遭到拒绝,仍等待所有 Promise 完成

在异步编程中,当某些任务失败时,处理 Promise 可能会带来挑战。让我们考虑以下场景:

const arr = [fetch('index.html'), fetch('http://does-not-exist')];

Promise.all(arr)
  .then(res => console.log('success', res))
  .catch(err => console.log('error', err)); // This is executed
登录后复制

上面的代码使用 fetch 发出网络请求。然而,由于 Promise.all 会在第一个失败的请求时拒绝,我们遇到了一个问题:我们如何处理所有任务的结果,甚至是那些失败的任务?

原生 JavaScript 解决方案

To为了解决这个问题,我们可以采用以下原生 JavaScript 技术:

  1. 使用 Reflect 创建 Wrapper Promise:
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));
登录后复制

此反射函数返回一个新的 Promise,该 Promise 解析为包含解析值或拒绝原因的对象,以及指示 Promise 状态的状态属性。

  1. 将 Reflect 应用于所有Promises:
var arr = [fetch('index.html'), fetch('http://does-not-exist')];

Promise.all(arr.map(reflect)).then(function(results){
  var success = results.filter(x => x.status === "fulfilled");
});
登录后复制

在此示例中,我们将 Reflect 应用于数组中的每个 Promise。生成的数组现在包含每个请求的具有状态和错误或值属性的对象。

现代替代方案:Promise.allSettled

对于现代解决方案,请考虑使用内置的 Promise.allSettled :

Promise.allSettled([promise]).then(([result]) => {
  // Code will execute regardless of the promise's state
  // { status: "fulfilled", value: 33 }
});
登录后复制

此方法提供了一种便捷的方法来处理所有已解决的承诺,无论它们如何

通过利用这些技术,您可以优雅地管理异步操作并访问所有承诺的结果,甚至是那些失败的结果,从而使您能够根据可用数据做出明智的决策。

以上是如何在异步 JavaScript 中处理所有 Promise,包括被拒绝的 Promise?的详细内容。更多信息请关注PHP中文网其他相关文章!

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