30 天 JavaScript 实战第 13 天 -- Promise 异步编程技巧 ES6 篇

面试官:小伙子,你的数组去重方式惊艳到我了

前端开发中,异步编程是一项非常重要的技能,因为 HTML、CSS、JavaScript 等资源的文件加载、网络请求以及浏览器本身的事件都属于异步操作。在 JavaScript 中,我们可以使用回调函数来处理异步编程,但是这种方式十分容易产生“回调地狱”的问题,所以 ES6 引入了 Promise,它是一种更好的异步编程方式。在本篇文章中,我们将深入学习 Promise 的相关知识。

什么是 Promise?

Promise 是一个异步编程的解决方案,它解决了回调函数嵌套难以维护的问题。Promise 的实现遵循先定义后执行的原则,通过链式调用来实现多个异步任务之间的执行规则,使得代码更加简洁和可读。ES6 中引入了 Promise 对象,我们可以通过 new Promise() 来创建一个 Promise 对象,它有三种状态:Pending、Fulfilled 和 Rejected。

  • Pending:初始状态,即未处理状态。
  • Fulfilled:处理成功状态。
  • Rejected:处理失败状态。

当 Promise 的状态从初始状态到成功状态或者失败状态时,会触发对应的回调函数。因此,Promise 可以用于接收异步操作的结果,以便进一步处理。下面是一个基础的 Promise 示例代码:

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

上述代码中,Promise 的构造函数中定义了一个异步操作,即 1 秒后返回一个随机数。如果随机数大于等于 0.5,就调用 resolve 方法将 Promise 的状态设置为 Fulfilled,否则则调用 reject 方法将状态设置为 Rejected。

在 Promise 实例中使用 then 方法,第一个函数参数用于处理成功的结果,第二个函数参数用于处理失败的结果。

Promise 链式调用

Promise 还支持链式调用,可以优雅地处理多个异步操作的顺序。Promise 链式调用中,每一个 then 方法都执行一个异步操作,并以当前 Promise 对象的返回值作为下一个 Promise 对象的参数,我们可以在 then 方法中返回一个新的 Promise 对象。下面是一个 Promise 链式调用示例代码:

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

上面的例子中,第一个 then 方法执行的异步操作返回一个 Promise 对象,并在该 Promise 对象的回调函数中将随机数乘以 2,然后返回这个新的 Promise 对象。第二个 then 方法中拿到的值就是第一个 then 方法返回的 Promise 对象的值。如果其中任意一个 Promise 对象被拒绝,就会调用 catch 方法处理异常。

Promise.all() 方法和 Promise.race() 方法

Promise.all() 方法可以接收一个由多个 Promise 对象组成的数组作为参数,当它们都成功执行时,返回一个由所有 Promise 对象返回的结果组成的数组对象,其顺序与参数数组中的顺序相同。如果其中任意一个 Promise 对象被拒绝,就会立即触发 reject 状态。

下面是一个 Promise.all() 演示代码:

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

上述代码中,Promise.all() 接收一个由三个 Promise 对象组成的数组作为参数,由于其中一个 Promise 对象被拒绝,所以整个 Promise.all() 被拒绝。

Promise.race() 方法返回一个 Promise 对象,其状态由参数数组中的第一个已完成的 Promise 对象状态决定。如果参数数组中没有一个 Promise 对象被完成或者被拒绝,那么 Promise.race() 将会一直等待,直到仍处于 Pending 状态时才返回。

下面是一个 Promise.race() 演示代码:

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

在上面的例子中,由于 promise2 的等待时间更短,所有它最先执行完成,所以控制台将输出“Resolved: Promise 2”字样。

结论

通过本篇文章的学习,我们已经深入了解了 Promise 异步编程技巧的相关知识。Promise 可以优雅地处理异步编程问题,避免回调地狱问题的产生,同时还支持链式调用、Promise.all() 方法以及 Promise.race() 方法等操作,使得代码更加简洁、易读和可维护。在实际开发中,我们可以根据具体场景灵活使用 Promise 技术,以提升应用程序的性能和可靠性。

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


猜你喜欢

  • Angular 中的管道

    Angular 中的管道(Pipe)是一种从模板中接收值,并在处理后返回新值的方式。管道可以在模板中使用 | 符号进行调用。Angular 内置了许多常用的管道,如 DatePipe、UpperCas...

    7 天前
  • ES12 中的 `RegExp.escape` 方法:简化正则表达式转义

    在前端开发中,常常需要使用正则表达式来处理字符串。但是,在实际开发中,我们有时候需要将一些特殊字符(如 $, ^, * 等)作为正则表达式的一部分进行匹配,但这些字符本身又需要进行转义,这会使得正则表...

    7 天前
  • Fastify Error:如何处理内部服务器 500 错误

    Fastify 是一个快速、低开销的 Node.js Web 框架,它旨在帮助您构建高效、可伸缩的 Web 应用程序。但是,当您的应用程序在 Fastify 上出现 500 错误时,您可能会感到困惑和...

    7 天前
  • 如何跨设备实现响应式设计

    在当今数字化时代,人们越来越多地使用不同类型的设备访问网站,如桌面电脑、笔记本电脑、平板电脑和智能手机等。因此,一个重要的挑战是如何为各种设备提供一致的用户体验,而响应式设计提供了解决这一问题的最佳方...

    7 天前
  • PWA 开发中的安全性:确保应用程序的完整性

    PWA(渐进式Web应用程序)是一种新兴的Web应用程序开发方式,它结合了Web应用程序和原生应用程序的优点。其中一个最显著的优势是它可以在离线时工作,这使得PWA适用于一些复杂或速度比较慢的Web应...

    7 天前
  • Jest 测试框架:如何进行并发测试

    Jest 测试框架:如何进行并发测试 在前端开发中,测试是不可避免的一个环节。而为了提高测试效率,使用 Jest 进行并发测试是一种比较好的方式。本文将详细介绍 Jest 的并发测试使用方法,以及在实...

    7 天前
  • 在 Express.js 中实现 OAuth 2.0 认证的方法

    OAuth 2.0 是一种常用的认证和授权协议,它允许用户授权第三方应用程序访问其受保护的资源。在本文中,我们将介绍如何在 Express.js 中实现 OAuth 2.0 认证的方法。

    7 天前
  • Docker Swarm 容器编排及常见问题解决

    在前端开发中,容器化技术已经成为一项重要的技术,而 Docker Swarm 就是一种常见的容器编排技术。在这篇文章中,我们将介绍 Docker Swarm 容器编排的基本概念以及如何解决常见问题。

    7 天前
  • ECMAScript 2015: 如何避免 JS 排序字符串的奇怪行为

    在开发过程中,我们经常需要对数据进行排序操作。对于数字和日期等非字符串类型的排序,通常仅需要使用 JavaScript 原生的 Array.sort() 方法即可。

    7 天前
  • Headless CMS 在企业信息化建设中的应用

    什么是 Headless CMS Headless CMS(无头CMS)是一种新型的内容管理系统架构,它与传统的CMS不同之处在于,它不关注前端,只专注于提供API接口供前端调用。

    7 天前
  • 无障碍网站中访问性表单设计的最佳实践

    随着互联网技术的发展,许多企业开始注意到无障碍网站设计的重要性,其中表单设计是一个重要的组成部分,因为表单是用户与网站交互的主要方式之一。 在无障碍网站设计中,表单的访问性是至关重要的,因为它们需要能...

    7 天前
  • RxJS 实践:使用 scan 操作符累加状态

    前言 RxJS 是一个流行的 JavaScript 库,它提供了一种响应式编程的范式,并通过一些强大的操作符,帮助开发人员处理事件流。在这篇文章中,我们将学习如何使用 RxJS 的 scan 操作符来...

    7 天前
  • 使用 Serverless 设置 API 网关的缓存

    在前端开发中,我们经常会需要使用 API 来获取数据,为了提升性能和降低服务器负载,使用缓存是一个不错的选择。而 Serverless 框架提供了一种方便快捷的方法来设置 API 网关的缓存。

    7 天前
  • 在 Next.js 中初始化页面资源的技巧

    Next.js 是一个基于 React 的服务端渲染框架,为开发者提供了简便的 SSR 实现方式和静态生成网站的方案。当我们使用 Next.js 时,为了提高页面的访问速度和性能,我们需要采取一些技巧...

    7 天前
  • PM2 进程在 Windows 系统中无法正常工作的解决方法

    前言 PM2 是一个流行的 Node.js 进程管理工具,它可以大大简化 Node.js 应用程序的部署和管理。然而,在 Windows 系统中,可能会出现 PM2 进程无法正常工作的问题。

    7 天前
  • Kubernetes 如何配置 Pod 的亲和性和反亲和性?

    Kubernetes 是一个开源的容器编排平台,可以帮助你快速运行分布式应用程序。在 Kubernetes 中,Pod 是最小的可部署对象,用于托管一个或多个紧密耦合的容器。

    7 天前
  • 如何使用 Vue.js 创建一个完整的 SPA 应用程序

    引言 Vue.js 是一款高效的 JavaScript 框架,它的出现极大地简化了前端开发的工作。Vue.js 的设计旨在使用户可以更直观、简单地构建 Web 应用程序。

    7 天前
  • 如何避免 SASS 编译后代码冗余?

    在前端开发中,使用 CSS 预处理器是非常普遍的。而 SASS 是其中最受欢迎的一种。SASS 提供了强大的功能,例如变量、嵌套、混合等,让 CSS 编写变得更加高效和易于维护。

    7 天前
  • Redis 实现分布式限流

    前言 在互联网应用高并发的背景下,我们需要在接口或者数据源等重要资源上实现限流措施,保证系统的稳定性和可靠性。在最近的项目中,我们采用了 Redis 来实现分布式限流。

    7 天前
  • 在 GraphQL 中处理文件上传

    随着现代 Web 应用程序的发展,越来越多的应用程序需要支持文件上传。GraphQL 是一种新兴的 API 查询语言和运行时,它提供了一种与客户端和服务器之间进行高效通信的方式。

    7 天前

相关推荐

    暂无文章