如何在 ECMAScript 2020 中使用 Promise.allSettled 适应单页应用

随着单页应用的普及,前端开发越来越需要使用异步编程来处理复杂的逻辑。而 Promise.all() 已经成为了处理多个异步操作的常用方式。但是常常会出现一些异步请求因为网络原因或者其他原因而失败,需要进行补救措施。这时候就需要使用 Promise.allSettled() 这个新 API 来处理这些情况。

Promise.all() 存在的问题

我们先来简单介绍一下 Promise.all() 的使用方法。Promise.all() 接收一个包含多个 Promise 对象的数组,返回一个新的 Promise 对象。当这个数组中的所有 Promise 都成功 resolve 的时候,新的 Promise 对象才会 resolve。否则,只要其中有一个 Promise reject,新的 Promise 对象就会 reject。例如:

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

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

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

上面的代码会在 2s 后输出 [1, 2]。但是如果 promise2 reject 了,我们的代码就会进入 catch 分支,因为 Promise.all() 会把所有 Promise 的错误信息一股脑地抛出来。这就让我们无法区分是哪个 Promise 出了问题,并且如果 Promise 数组中的 Promise 数量很多,你还需要写很多代码来区分是哪个 Promise 出了问题。

这个时候,Promise.allSettled() 就会显得尤为重要。

Promise.allSettled() 的使用

Promise.allSettled() 的使用方式和 Promise.all() 类似,同样需要一个包含多个 Promise 对象的数组,并且也返回一个新的 Promise 对象。不过,Promise.allSettled() 返回的 Promise 对象永远都是 resolved,不管数组中的 Promise 成功还是失败。Promise.allSettled() 返回的是一个数组,数组的每个元素都是表示对应 Promise 的状态。

下面看一个简单的示例:

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

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

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

这个代码会在 2s 后输出一个数组,并且数组的两个元素的值分别为:

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

可以看到,Promise.allSettled() 把 Promise 的状态保存在了 value 和 reason 字段中,同时也能够避免 Promise.all() 中 Promise 失败抛出异常的问题。

Promise.allSettled() 在单页应用中的应用

在单页应用中,常常会需要同时发送多个 Ajax 请求,并在所有请求都完成后执行一些逻辑。例如:

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

但是如果其中某个请求失败了怎么办呢?如果使用 Promise.all(),那么就会出现上一节中提到的有错误则全部 reject 的问题。这时候,就需要使用 Promise.allSettled(),并对每个 Promise 的执行结果进行判断。例如:

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

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

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

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

上述代码就能够实现在执行多个 Ajax 请求后,当所有请求都完成后检查是否有请求异常,并一一处理异常结果。

总结

如果你是一个前端开发者,那么 Promise.all() 和 Promise.allSettled() 一定是你日常工作中必不可少的工具之一。在单页应用中,我们常常会使用 Promise.all() 来处理多个异步请求。但是 Promise.all() 无法准确处理请求异常的问题,这时候,Promise.allSettled() 就能够派上用场。在了解了 Promise.allSettled() 的使用方法后,相信你已经能够快速上手使用它了。

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


猜你喜欢

  • 在 ECMAScript 2017 中使用 Proxy 构造函数进行对象代理

    随着现代前端开发的不断发展,JavaScript 作为一门动态语言和脚本语言,也在不断地创新和进化。其中,ECMAScript 2017 中引入了 Proxy 构造函数,它可以用于创建一个代理对象,从...

    1 年前
  • 如何使用 Express.js 处理 XML 数据

    在前端开发中,我们经常需要处理各种种类的数据,其中包括 XML 数据。XML 是一种数据格式,用于描述和传输数据,而 Express.js 则是一个使用 Node.js 构建的 Web 开发框架。

    1 年前
  • # TypeScript 中如何使用 "readonly" 修饰符

    TypeScript 中如何使用 "readonly" 修饰符 在 TypeScript 中,我们可以使用 "readonly" 修饰符来定义只读属性。只读属性只能在初始化时被赋值,无法被修改。

    1 年前
  • 给 Serverless Framework 和 FaaS 替换指南

    前言 Serverless 是指一种构建和部署应用程序的方式,它通过将应用程序的部署和管理任务交给第三方服务提供商来实现,这些服务提供商负责维护和缩放应用程序所需的基础设施。

    1 年前
  • ECMAScript 2019 中的函数默认参数:为函数参数提供默认值

    ECMAScript 2019 中的函数默认参数:为函数参数提供默认值 ES2019(ES10)是 ECMAScript 标准的最新版本,它引入了许多新的特性和语法,其中一个是函数默认参数。

    1 年前
  • Docker 镜像下载不了该怎么办?

    在使用 Docker 进行应用部署的时候,我们常常需要下载完成一些必须的镜像文件以便顺利运行应用。可是有时候我们下载的镜像文件却无法成功,那么我们该怎么办呢?本文将为您解答这一问题,并提供详细的学习指...

    1 年前
  • 如何在 ES7 中使用 Set 来存储集合

    在前端开发中,经常需要处理集合数据,比如去重、筛选等。ES7 中新增了 Set 数据结构,可以方便地存储和操作集合数据。本文将介绍如何在 ES7 中使用 Set 来存储集合。

    1 年前
  • RxJS 实践:使用 takeLast 和 last 操作符获取最后 N 个值

    RxJS 是一款针对异步数据流的响应式编程库,它可以帮助开发者更方便地管理异步事件流。在 RxJS 中,我们可以使用 takeLast 和 last 操作符来获取最后 N 个数据,本文将介绍如何使用 ...

    1 年前
  • Next.js 中使用 styled-components 进行 css-in-js 处理

    在前端开发中,CSS 是必不可少的一部分。然而,使用原生的 CSS 有时会变得很复杂,因为样式随着项目的增长而变得越来越难以管理。为了解决这个问题,出现了一种新的方式,即 CSS-in-JS。

    1 年前
  • 在 ES12 中使用 Math.signbit 方法判断浮点数符号位

    在 JavaScript 中,判断一个数字的符号位一直都是一个令人头疼的问题。我们可以使用 Math.sign 方法来判断一个数字的正负性,但是它无法直接返回数字的符号位。

    1 年前
  • Mongoose 的 Hook 机制,记录你的睡眠时间

    1. 什么是 Mongoose 的 Hook 机制 Mongoose 是 Node.js 中一个优秀的 MongoDB 库,它的 Hook 机制可以让我们在数据库操作之前或之后执行一些自定义代码,以此...

    1 年前
  • 如何使用 Promise.allSettled 返回所有结果

    在前端开发过程中, 往往需要对多个异步请求进行处理, 而 Promise.allSettled 可以方便地用于处理多个异步请求, 并且返回所有结果。本文将详细介绍 Promise.allSettled...

    1 年前
  • 如何使用 Fastify 和 Express.js 共同开发 Web 应用程序

    随着互联网的不断发展,Web 应用程序已经成为我们日常生活中不可或缺的一部分。作为前端开发人员,我们需要不断学习新的技术和工具来应对不断变化的 Web 应用程序开发环境。

    1 年前
  • Angular 6 中使用图表库 ngx-charts

    在 Web 应用程序中,数据可视化是至关重要的。图表是展示数据最常用的方式之一,可以帮助用户更直观地理解和分析数据。在前端开发中,使用现成的图表库可以极大地减少开发量和提升开发效率。

    1 年前
  • ES9 优质文章推荐:全面掌握 ECMAScript

    ECMAScript(简称 ES)是一种基于 Web 平台的脚本语言,由 ECMAScript 标准规定语言的语法和语义。除了浏览器端,ES 也广泛应用于 Node.js 和其他平台。

    1 年前
  • 如何使用 SASS 实现语义化的 CSS?

    前言 在编写 CSS 代码时,我们都会遇到一些问题,例如命名不规范、选择器嵌套过深、重复的样式等等。这些问题会导致代码难以维护,增加开发者的工作量。同时,CSS本身的语法也有一些限制,使得我们无法充分...

    1 年前
  • 如何使用 Mocha 和 Chai 测试 Vue.js 组件?

    前言 在前端开发中,测试是很重要的一项工作。测试可以保障代码的质量,减少 Bug 的出现,提高项目的稳定性和可维护性。Vue.js 是一个流行的 JavaScript 框架,本文将介绍如何使用 Moc...

    1 年前
  • 在 Angular 项目中使用 ESLint 提高代码质量

    在 Angular 项目中使用 ESLint 提高代码质量 eslint 是一款常用的 JavaScript 代码检测工具。它能够识别出开发者代码中的潜在问题,并为代码质量提供有效改进建议。

    1 年前
  • Koa2 中如何进行接口鉴权

    在前端开发中,接口鉴权是一个非常重要的问题。它可以保证系统的安全性,避免非法用户访问系统的敏感数据。在 Koa2 中进行接口鉴权的过程,需要经历以下几个步骤: 定义一个全局中间件:在 Koa2 中,...

    1 年前
  • Web Components 实现在线文本编辑器的方法解析

    随着前端技术的不断发展,Web Components 愈发重要。Web Components 是一种前端框架,可以让开发者更加轻松便捷地创建可重用的自定义 HTML 元素。

    1 年前

相关推荐

    暂无文章