详解 Promise 的 then 和 catch 方法的执行顺序及错误处理机制

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

在前端开发中,我们经常需要处理异步任务,Promise 是最常用的处理异步的方式之一。Promise 提供了 then 和 catch 方法来处理异步操作的成功和失败的情况。但是,对这两个方法的执行顺序及错误处理机制可能不够清晰。下面我们将详细介绍 Promise 的 then 和 catch 方法的执行顺序及错误处理机制。

Promise 的 then 方法

Promise 的 then 方法用于处理异步任务成功的情况。其语法为:

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

其中,onFulfilled 为成功的回调函数,onRejected 为失败的回调函数。当 Promise 对象的状态为 fulfilled(成功)时,会执行 onFulfilled 方法;当 Promise 对象的状态为 rejected(失败)时,会执行 onRejected 方法。

多个 then 方法可以链式调用,如:

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

链式调用的时候,每一个 then 方法的返回值都是一个新的 Promise 对象。

Promise 的 catch 方法

Promise 的 catch 方法用于处理异步任务失败的情况。其语法为:

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

其中,onRejected 为失败的回调函数。当 Promise 对象的状态为 rejected(失败)时,会执行 onRejected 方法。catch 方法实际上是 then 方法的一种特殊形式,可以看作是 then(null, onRejected) 的简写。

Promise 的执行顺序

在 Promise 中,then 方法和 catch 方法的执行顺序是有规律的。

首先,当 Promise 对象的状态为 pending(进行中)时,then 和 catch 方法不会执行。当 Promise 对象的状态为 fulfilled 时,then 方法会执行,catch 方法不会执行。当 Promise 对象的状态为 rejected 时,catch 方法会执行,then 方法不会执行。当 Promise 对象的状态已经变成 fulfilled 或 rejected 时,then 和 catch 方法都会执行。

具体地,我们可以通过如下代码来理解 Promise 的执行顺序:

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

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

代码中的 promise 对象状态将在 1 秒后变为 fulfilled。在这种情况下,then 方法将执行,catch 方法不执行,因为 promise 对象变成了 fulfilled 状态。如果 promise 对象的状态在 1 秒后变为 rejected,则 catch 方法将执行,then 方法不执行。

Promise 的错误处理机制

在 Promise 中,如果发生错误,可以使用 catch 方法来处理错误。当然,也可以在 then 方法中的回调函数中抛出错误,然后在链式调用的后续 catch 方法中进行错误处理。如下所示:

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

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

代码中的 promise 对象状态将在 1 秒后变为 rejected。在这种情况下,then 方法不执行,catch 方法将执行。在 then 方法的回调函数中,我们抛出了一个错误,它将被 catch 方法捕获并处理。

上面的例子也提醒我们,在链式调用的操作中,错误应当在 catch 方法中被处理,而不能被默默忽略。

总结

本文介绍了 Promise 的 then 和 catch 方法的执行顺序及错误处理机制。

在 Promise 中,当 Promise 对象的状态为 fulfilled 时,then 方法执行;当 Promise 对象的状态为 rejected 时,catch 方法执行。如果 promise 对象状态为 pending,那么 then 和 catch 方法不会执行。当 Promise 对象的状态已经变成 fulfilled 或 rejected 时,then 和 catch 方法都会执行。

当 Promise 抛出错误时,错误应该在 catch 方法中被处理,而不能被默默忽略。希望对大家对 Promise 的使用有所帮助。

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


猜你喜欢

  • Mongoose 之使用 $pull 操作符删除文档中的数组元素

    在 MongoDB 中,数组是常见的一种数据类型。而在 Mongoose 中,则可以使用 $pull 操作符删除文档中的数组元素。 $pull 操作符的基本语法 $pull 操作符可以用于从数组中删除...

    1 年前
  • 异步编程进阶 —— 探究 ES8 中的 async 和 await

    随着 JavaScript 应用程序的复杂性快速增长,异步编程已经成为了前端开发中不可避免的话题。虽然 JavaScript 提供了回调函数和 Promise 等构建异步代码的基本工具,但这些工具可能...

    1 年前
  • ES7 中的 Object.entries 方法在处理对象遍历中的应用

    ES7 中的 Object.entries 方法在处理对象遍历中的应用 在前端开发中,遍历对象是一项基本操作。ES6 带来了新的遍历方式,例如 for...of 和 forEach()。

    1 年前
  • 在 Angular 中使用 ngOnChanges 监听对象属性值的变化

    Angular 中 ngOnChanges 生命周期钩子函数被用来监听父子组件之间对象属性值的变化。通过使用 ngOnChanges 函数,我们能够在组件属性值发生变化时发出响应,以便对数据进行相应的...

    1 年前
  • 使用 ES11 中的 BigInt 类型进行交易计算

    随着区块链技术的发展,数字货币交易越来越普遍。在交易过程中,对于特别大的数字,JavaScript 原生的 Number 类型可能会导致精度问题。为了解决这个问题,ES11 引入了 BigInt 类型...

    1 年前
  • Kubernetes 中掌握常见的协调器(Controller)技巧

    Kubernetes 中掌握常见的协调器(Controller)技巧 Kubernetes 是一个开源的容器编排工具,可以帮助开发者自动化管理容器化的应用。在 Kubernetes 中,协调器(Con...

    1 年前
  • 解决 Fastify 应用程序因路由注册错误导致的问题

    在使用 Fastify 开发 Web 应用程序过程中,我们通常会将不同的路由分配给不同的处理程序函数。但是,由于一些常见的错误,我们经常会遇到应用程序运行时因路由注册错误而导致的问题。

    1 年前
  • 使用 LESS 编写优雅的 CSS

    前言 随着前端技术的发展,CSS 已经不再是一种简单的样式语言,而是有着丰富功能和复杂的结构。而LESS是一种主流的CSS预处理器,可以简化CSS编写并增加了一些强大的功能。

    1 年前
  • Angular 与 RxJS:如何更快开发更好的应用

    在现代的前端应用中,随着应用的复杂性不断提高,同时数据的交互和管理也变得越来越重要,开发者需要使用一些工具来帮助他们更好地管理应用状态和数据流。其中,RxJS 和 Angular 是两个非常有用的工具...

    1 年前
  • Deno 中的环境变量管理技巧

    在 Deno 中,环境变量是一种重要的配置管理方式。本文将介绍如何在 Deno 中管理环境变量,包括如何设置、读取和删除环境变量,并提供各种实用技巧和示例代码。 设置环境变量 在 Deno 中设置环境...

    1 年前
  • 优化 MySQL 查询语句的技巧和方法

    MySQL 是一款常用的关系型数据库,而数据库的性能和查询效率对于一个系统来说至关重要。在本文中,我们将探讨如何优化 MySQL 查询语句的技巧和方法。 索引的使用 索引是优化 MySQL 查询语句的...

    1 年前
  • 如何在 Angular 中使用 Server-Sent Events 实现实时数据推送

    实时数据推送在现代 web 应用程序中越来越普遍。在传统的 web 应用程序中,客户端多数使用定期轮询机制从服务器拉取新数据。这种方式不仅效率低下,而且浪费过多带宽和服务器资源。

    1 年前
  • PM2 如何处理进程崩溃和异常

    在前端开发中,我们常常需要启动多个进程来进行不同的任务。但是,这些进程出现崩溃和异常的情况是难以避免的。为了保障系统的稳定性和可靠性,我们需要使用一款工具来管理进程,而 PM2 就是一个非常优秀的选择...

    1 年前
  • ES12 JavaScript:使用输出运算符在 JavaScript 中进行调试

    在 JavaScript 中进行调试是前端开发中必不可少的步骤。ES12 JavaScript 提供了一个输出运算符,在调试中起到很大的帮助作用。本文将会详细介绍这个输出运算符并提供示例代码进行演示。

    1 年前
  • Webpack 构建时出现的 UglifyJsPlugin 相关错误该怎么办?

    在前端开发中,为了优化网站性能,我们经常使用 Webpack 进行代码打包和构建。而在 Webpack 构建时,经常会发现 UglifyJsPlugin 相关的错误,这些错误信息不仅影响开发效率,也影...

    1 年前
  • ES10 中解决 JavaScript 数字问题的方法介绍

    在 JavaScript 中,数字计算是很常见的问题。然而,由于浮点数的精度问题,数字计算时很容易出现错误,这给前端开发带来了困扰。ES10 中引入了一些新功能,可以有效地解决这些问题。

    1 年前
  • 使用 Mocha 和 Supertest 进行 RESTful API 集成测试的教程

    在前端开发中,RESTful API 是必不可少的一部分。为了确保 API 接口的健壮性、安全性和可靠性,我们需要写一些集成测试来验证接口的正确性。本文将介绍如何使用 Mocha 和 Supertes...

    1 年前
  • 如何在一个 Babel 编译的 React 应用中添加 WebPack 模块?

    #如何在一个 Babel 编译的 React 应用中添加 WebPack 模块? 当我们使用 React 来编写单页应用时,经常需要添加一些依赖库和模块来增强功能。

    1 年前
  • ES9的新特性:Generators with return and throw

    ES9是ECMAScript的第9个版本,其中包含了许多重要的新特性。其中,Generators with return and throw是一项非常值得关注的新增特性。

    1 年前
  • React 单元测试之使用 Enzyme 测试组件 props 和 state

    React 是一种基于组件化和状态管理的前端框架。它的组件化特征让代码更加模块化、可维护性更高;而状态管理的特性则使得应用状态的变化更加可控,更加易于调试。然而,为了确保 React 应用程序的质量,...

    1 年前

相关推荐

    暂无文章