如何解决 Promise.all 遇到 reject 只执行部分 promise 的问题

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

使用 Promise.all 可以同时执行多个 promise,并在所有 promise 都完成(即所有 promise 都 fulfilled 或有至少一个 promise rejected)后返回结果。但是,如果其中有一个 promise 被 reject,Promise.all 就会立即终止,并返回一个拒绝的 promise。

这种行为有时可能会带来麻烦,因为在某些情况下我们需要知道所有 promise 的状态,而不仅仅是它们中的一些。

在本文中,我们将讨论如何解决 Promise.all 遇到 reject 只执行部分 promise 的问题。

使用 Promise.allSettled

ES2020 引入了 Promise.allSettled 方法,该方法会执行所有的 promise,并等待所有 promise 都 settled(已完成,即 fulfilled 或 rejected),然后返回一个数组,该数组包含每个 promise 的状态和结果。

Promise.allSettled 返回的数组的每个元素都是一个包含以下两个键的对象:

  • status:表示 promise 的状态,可以是 "fulfilled""rejected"
  • valuereason:分别表示 promise fulfilled 的结果和 rejected 的原因

以下是 Promise.allSettled 的示例代码:

----- -------- - -------------------
----- -------- - --- ----------------- ------- -- ------------------ ---- ------ ------------
----- -------- - --- --------------- -- ------------------- ---- --------

----------------------------- --------- ----------
    ------------- -- ----------------------

上面代码中,promise2 是个 rejected 的 promise,但是 Promise.allSettled 仍然会等待所有 promise 都 settled,然后返回一个数组,该数组包含每个 promise 的状态和结果:

-
  - ------- ------------ ------ - --
  - ------- ----------- ------- ------ --------- --
  - ------- ------------ ------ ----- -
-

使用 Promise.allSettled 可以确保我们处理了所有 promise 的状态,并避免了因为某个 promise 被 reject 导致我们无法获取所有 promise 的状态的情况。

但是,我们可能仍然需要利用 Promise.all 的并行特性,以实现更高效的编程。

手动计数器

我们可以手动跟踪所有 promise 的状态,并在所有 promise settled 后自己返回一个数组。

以下是手动计数器的示例代码:

-------- -------------------------------- -
    --- -------------- - --
    --- ------------- - --
    ----- ------- - ---
    
    ------ --- ----------------- -- -
        -------------------------- ------ -- -
            ------------------ -- -
                -----------------
                -------------- - - ------- ------------ ----- --
                -- --------------- - ------------- --- ---------------- -
                    -----------------
                -
            --------------- -- -
                ----------------
                -------------- - - ------- ----------- ------ --
                -- --------------- - ------------- --- ---------------- -
                    -----------------
                -
            --
        ---
    ---
-

----- -------- - -------------------
----- -------- - --- ----------------- ------- -- ------------------ ---- ------ ------------
----- -------- - --- --------------- -- ------------------- ---- --------

--------------------------------- --------- ----------
    ------------- -- ----------------------

上面代码中,我们创建了一个 Promise 对象,并在这个对象中对所有 promise 的状态进行了跟踪。当每个 promise 完成时,我们按照其状态更新计数器和结果数组。在所有 promise 都 settled(已完成,即 fulfilled 或 rejected)后,我们能够返回一个数组,该数组包含每个 promise 的状态和结果。

这种方法手动维护计数器会比 Promise.allSettled 更冗长且容易出错,但在某些情况下,这可能是必须的。

结论

在某些情况下,我们需要知道所有 promise 的状态,并且不想因为某个 promise 被 reject 而失去对其他 promise 状态的跟踪。对于这种情况,我们可以使用 Promise.allSettled。

但有时我们需要更高效地处理多个 promise。在这种情况下,我们可能需要手动跟踪所有 promise 的状态,并在所有 promise settled 后自己返回一个数组。

虽然我们可以使用这两种方法处理 Promise.all 遇到 reject 只执行部分 promise 的问题,但我们应该选择适合我们特定情况的方法。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/67188adfad1e889fe22c56f1


猜你喜欢

  • Redux 状态管理优化实践

    Redux 是一个非常有用的状态管理库,可以帮助前端开发者更好地管理复杂的应用程序状态。但是,如果不正确使用,Redux 可能会使应用程序变得复杂难以维护。本文将深入探讨 Redux 优化实践,以帮助...

    16 天前
  • 通过 Tailwind 的前缀类和间接类来快速定位和修改样式

    Tailwind是一个流行的CSS框架,其设计理念是通过预定义的class快速定位和修改样式。 在Tailwind中,class通常由两部分组成:前缀类和间接类。其中前缀类表示样式的某个属性,而间接类...

    16 天前
  • MongoDB 副本集与集群区别及选择

    一、MongoDB 副本集和集群的概念 MongoDB 是一种非关系型数据库,支持副本集和集群两种架构方式。 MongoDB 副本集:是指一组 MongoDB 服务器的集合。

    16 天前
  • TypeScript 中使用依赖注入实现服务的解耦

    TypeScript 中使用依赖注入实现服务的解耦 随着前端应用变得越来越复杂,我们需要更好的代码组织和管理方式。依赖注入是一种实现代码解耦的技术。TypeScript 作为一种强类型的 JavaSc...

    16 天前
  • 如何使用 Chai.js 和 Istanbul 来做代码覆盖率测试?

    在软件开发中,代码覆盖率测试是一项必不可少的活动。通过对代码执行路径的跟踪并记录,代码覆盖率测试可以帮助我们确定代码中哪些部分已经被测试过,哪些部分还需要进一步的测试。

    16 天前
  • 在 ES8 中使用 Proxy 实现内置对象的监听

    ES8(ECMAScript 2017)是 JavaScript 的最新版本,它引入了一种名为 Proxy 的新对象类型。Proxy 是一种高级的元编程机制,它可用于构建代码库以及 JavaScrip...

    16 天前
  • Kubernetes 中如何使用官方提供的 Helm Charts 快速部署服务?

    Helm 是一个在 Kubernetes 中用于管理应用程序的工具,它基于 Charts 的概念提供了一种简单的方式来打包、部署和管理 Kubernetes 应用程序。

    16 天前
  • 解决使用 Custom Elements 时出现的常见错误

    Custom Elements 是 Web Components 标准的其中一部分,它允许开发者自定义 HTML 元素并进行封装,以提高组件的可复用性和可维护性。然而,在使用 Custom Eleme...

    16 天前
  • SPA 应用 SEO 优化实践之 React 项目

    随着互联网的发展,越来越多的网站开始使用单页面应用(SPA)来提供更好的用户体验。这种应用程序的特点是它们只加载一次 HTML,然后通过 AJAX 加载并显示不同的视图,因此用户在与应用程序交互时不必...

    16 天前
  • 使用 Hapi.js 构建 WebSocket 应用程序

    WebSocket 是一种在客户端和服务器之间建立双向通信的协议,使用它可以实现实时的数据传输和即时通信。在制作实时应用程序或在线游戏时使用 WebSocket 是非常方便和有效的。

    16 天前
  • 如何使用 Tailwind 在不同媒体查询下实现响应式设计

    在现代 Web 开发中,响应式设计成为了不可忽视和必须掌握的一项技能,因为不同的屏幕尺寸和设备类型需要不同的布局和样式。为了方便和高效地实现响应式设计,Tailwind 成为了越来越流行的 CSS 框...

    16 天前
  • 如何在 Cypress 中处理页面滚动?

    介绍 Cypress 是一个流行的前端自动化测试工具,但是在测试一些需要滚动页面的场景时,我们需要更多的技巧来处理页面滚动。在本文中,我们将探讨如何在 Cypress 中处理页面滚动,以方便更好的编写...

    16 天前
  • 使用 Headless CMS 开发静态网站的步骤及技巧

    无论是企业网站还是个人博客,静态网站已成为更高效、更安全的选择。但是,在使用现有的静态网站生成器时,我们经常需要牺牲灵活性来获得这些好处。此时,Headless CMS 可以帮助我们保持此灵活性,同时...

    16 天前
  • TypeScript 中使用科学计数法表示数值的方法

    在 TypeScript 中,表示科学计数法的数值非常常见,例如当数字过大或过小时使用科学计数法常常可以让数字变得更加易读。在本文中,我们将探讨 TypeScript 中使用科学计数法表示数值的方法,...

    16 天前
  • 在 Jest 中测试 Redux 调度程序

    在 Jest 中测试 Redux 调度程序 Redux 是一个流行的 JavaScript 应用程序状态管理工具,深受前端开发人员的喜爱。但是,要正确地管理 Redux 应用程序需要编写一些非常好的调...

    16 天前
  • Vue 中使用 Promise.all 解决同时发起 N 个请求的问题

    在开发中,我们常常需要发起多个请求来获取所需的数据。如果一个一个发起请求,那么效率会非常低下。Vue 提供了 Promise.all 方法,可以让我们同时发起多个请求,并等待它们全部完成后再处理数据。

    16 天前
  • 使用 Server-Sent Events 实现实时统计数据展示

    简介 在 web 应用程序中,实时数据展示是一项非常重要的功能。例如,一个网站可能需要实时展示在线访问者的数量,或者实时展示当前在线的聊天用户。在传统的 web 应用程序中,为了实时地展示这些数据,通...

    16 天前
  • 解决 Fastify 应用程序中因严格模式导致的错误

    在使用 Fastify 构建 web 应用程序时,由于其默认使用严格模式,会导致一些错误。本文将介绍如何解决这些错误,并提供示例代码以供参考。 什么是严格模式? 严格模式是 JavaScript 的一...

    16 天前
  • 如何使用 CSS Reset 实现高可读性页面样式设计

    在前端开发中,CSS 是非常重要的一部分。但是,在开发不同的页面时,页面样式可能会受到浏览器默认样式的影响,导致样式不够统一,或者布局不够清晰,高度自由的 CSS 设计能够解决这个问题。

    16 天前
  • Redis 性能优化及减少 I/O 等待方案探究

    Redis 是一种高性能的键值存储系统,广泛用于 web 应用程序中作为数据库、缓存和消息队列。但是在高并发的情况下,Redis 的 I/O 瓶颈会成为一个性能瓶颈,导致应用程序的性能下降。

    16 天前

相关推荐

    暂无文章