ES11 的异步编程演进之 Promise.allSettled() 方法。

随着前端技术的不断发展,异步编程已成为前端开发的重要部分。在过去,我们通常使用回调函数进行异步编程,但这种方式存在着回调地狱和可读性差等问题。为了解决这些问题,Promise 出现了,并且在 ES6 中得到了官方支持。ES11 中新增的 Promise.allSettled() 方法则进一步拓展了 Promise 的功能。

Promise.all()

在介绍 Promise.allSettled() 方法之前,我们先来简单回顾一下 Promise.all() 方法。Promise.all() 方法接收一个 Promise 数组作为参数,返回值为一个新的 Promise 对象。当传入的所有 Promise 都变为 resolved 时,返回的 Promise 对象才会变为 resolved;当传入的 Promise 中至少有一个变为 rejected 时,返回的 Promise 对象才会变为 rejected。

以下是 Promise.all() 方法的示例代码:

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

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

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

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

执行以上代码,控制台输出为:

-- --------

可以看到,由于 p3 被 reject 了,Promise.all() 的返回值也是 rejected。

Promise.allSettled()

Promise.allSettled() 方法与 Promise.all() 类似,但它不会因为某个 Promise 被 reject 而立即退出并 reject,而是会等到所有 Promise 都执行完毕后再返回结果,返回的结果是一个包含每个 Promise 执行后状态的数组。

以下是 Promise.allSettled() 方法的示例代码:

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

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

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

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

执行以上代码,控制台输出为:

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

可以看到,Promise.allSettled() 方法返回的是一个包含每个 Promise 执行后状态的数组,其中对象的 status 属性可能是 fulfilled 或 rejected,分别表示 Promise 的状态是 resolved 或 rejected。如果状态是 fulfilled,value 属性表示 Promise 的返回值;如果状态是 rejected,reason 属性表示 Promise 的错误信息。

应用场景

Promise.allSettled() 方法是在 Promise.all() 方法的基础上新增的方法,主要用于以下场景:

  • 需要等待多个 Promise 全部执行完毕,而不管执行结果是 fulfilled 还是 rejected。
  • 需要将所有 Promise 的执行结果统一处理,而不是在 Promise 中逐个处理结果。

例如,我们可以使用 Promise.allSettled() 方法来批量上传文件,然后将所有文件的上传结果统一处理,如下:

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

在 uploadFiles() 函数中,我们使用 Promise.allSettled() 方法将所有 Promise 的执行结果统一处理并输出,无论是 fulfilled 还是 rejected。

总结

Promise.allSettled() 方法是 Promise 的一个拓展方法,用于将多个 Promise 的执行结果统一处理。与 Promise.all() 方法不同,Promise.allSettled() 方法不会因为某个 Promise 被 reject 而立即返回,并且返回的结果是一个包含每个 Promise 执行后状态的数组。在实际开发中,我们可以通过使用 Promise.allSettled() 方法来统一处理多个 Promise 的执行结果,从而提高代码的可维护性和可读性。

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


猜你喜欢

  • Hapi 中如何处理 URL 参数

    Hapi 是一款现代化的 Node.js Web 应用程序框架,它的流程控制非常简单,同时也非常强大。在 Hapi 中,URL 参数的处理是非常简单的,这篇文章我们将详细介绍在 Hapi 中如何处理 ...

    5 个月前
  • Redux-thunk 和 Redux-saga 的优缺点分析

    Redux-thunk 和 Redux-saga 是 Redux 中常用的两种中间件,它们的主要作用是在 Redux 中处理异步操作。本文将会从使用、优缺点以及适用场景等角度对 Redux-thunk...

    5 个月前
  • Deno 中如何使用 ORM 对数据库进行访问

    在现代 Web 应用程序开发中,ORM(Object-Relational Mapping)是一个非常流行的工具。ORM 可以让开发者使用面向对象的方式操作数据库,从而避免了手写 SQL 的复杂性和重...

    5 个月前
  • build 的时候遇到的 bug 及解决方式

    在前端开发中,我们常常需要进行打包和构建项目。然而,有时在 build 的过程中会遇到各种各样的问题,这些问题会影响项目的正常运行。本文将针对一些常见的 build 时的 Bug 进行详细分析,并提供...

    5 个月前
  • Babel 编译 es6 的 babel-preset-es2015 的使用问题解决

    如果你正在学习或者使用前端开发,那么你应该已经知道了 ES6(ECMAScript 6)的重要性。然而,由于目前许多浏览器还未支持 ES6,并不是所有的浏览器都能够正确地解析 ES6 代码。

    5 个月前
  • ES9 中扁平化数组的两个关键字

    扁平化数组是前端中常用的操作,其主要功能是将多维嵌套的数组转化为一维数组。在ES9中,有两个关键字可以帮助我们更容易地实现数组扁平化操作:flat()和flatMap()。

    5 个月前
  • Babel 转义箭头函数时出现 “arrow function” 的错误解决方案

    在前端开发中使用箭头函数已经变得非常普遍,然而在使用 Babel 转译箭头函数时,有时会出现“arrow function”的错误。本文将介绍如何解决这个问题。 问题描述 当使用 babel 转译箭头...

    5 个月前
  • React 单元测试:安利一下 Enzyme

    React 单元测试:安利一下 Enzyme React 已经成为了现代前端开发的主流技术之一,但要充分利用它的好处还需要对 React 组件进行单元测试。对于初学者来说,这显然是一项挑战,但是这篇文...

    5 个月前
  • Angular 5 教程:解决键盘事件处理程序错误

    在前端开发中,处理键盘事件是非常普遍的需求。而在使用 Angular 5 进行开发时,处理键盘事件也是很常见的操作。但有时候我们可能会遇到一些问题,比如键盘事件处理程序不起作用或者出现错误。

    5 个月前
  • sequelize 生成表时 TypeError: Cannot set property 'primaryKey' of undefined

    在 Node.js 中,Sequelize 是一个常用的 ORM(Object-Relational Mapping,对象关系映射) 框架。当我们使用 Sequelize 构建应用程序时,遇到表生成失...

    5 个月前
  • Java 性能优化:从 JVM 角度出发

    Java 是一种广泛使用的编程语言,在 Web 开发、移动应用等领域都有广泛的应用。随着应用程序规模的不断扩大和复杂度的增加,Java 应用程序的性能优化变得越来越重要。

    5 个月前
  • ES10:Array.flat()、Array.flatMap() 及其他一个实用的新数组函数

    ES10:Array.flat()、Array.flatMap() 及其他一个实用的新数组函数 ES10 提供了一些新的数组函数,这些函数可以使我们更方便地处理数组。

    5 个月前
  • 如何创建简单的 Material Design 对话框

    Material Design 是 Google 推出的一种全新的设计语言,它的特色是平面化设计和强调视觉层级。Material Design 为用户提供了更具有直观性和易用性的用户体验。

    5 个月前
  • Webpack 中 css-loader 和 style-loader 的使用

    Webpack 是一个模块打包工具,可以将多个模块打包成一个文件。它的特点是可以处理各种不同的资源,并且有强大的插件系统。其中,css-loader 和 style-loader 是处理 CSS 样式...

    5 个月前
  • Express 和 Fastify 框架的比较及使用场景

    在前端开发中,我们经常需要使用到后端框架。Express 和 Fastify 是目前比较流行的两个 Node.js 服务框架。它们都有自己的优缺点和适用场景。在本篇文章中,我们将会探讨这两个框架的差异...

    5 个月前
  • Docker 部署 CI/CD 流水线实践

    在前端开发中,CI/CD 是一个非常重要的流程。它可以提高开发流程的效率和质量。Docker 是一个功能强大的容器化技术,它可以帮助我们更加简单、高效地部署 CI/CD 流水线。

    5 个月前
  • Mongoose 中的时间戳:在文档中添加 createdAt 和 updatedAt 字段

    在使用 MongoDB 进行数据存储时,我们经常面临这样的问题:如何记录文档的创建时间和更新时间?这在很多业务场景下是非常必要的,比如后台管理系统需要记录用户的最后登录时间,或者需要计算文档的过期时间...

    5 个月前
  • Redis 中如何自动删除过期的 key

    在使用 Redis 缓存数据时,有时我们需要设置一个 key 在一定时间后自动过期。当数据过期时,Redis 应该自动删除这个 key,以释放内存空间。那么,Redis 中如何实现自动删除过期的 ke...

    5 个月前
  • Socket.io 如何实现广播消息?

    Socket.io 是一种实现实时、双向、事件驱动通信的库,它可以在前端和后端之间建立 WebSocket 连接,实现即时通讯、直播等需要实时通信的场景。在这些场景下,经常需要向多个客户端广播消息,本...

    5 个月前
  • 从 Redux 到 MobX 浅析 React 的状态管理

    状态管理在 React 开发中扮演着至关重要的角色,学习并掌握一种好的状态管理方案能够提高开发效率,增强代码质量。Redux 作为 React 官方推荐的状态管理方案受到了广泛的使用和关注,而 Mob...

    5 个月前

相关推荐

    暂无文章