Promise 中的 unhandledrejection 事件详解

阅读时长 7 分钟读完

Promise 中的 unhandledrejection 事件详解

Promise 是 JavaScript 中处理异步操作的一种解决方案。它是 ES6 中新增的语法规范,它通过一系列 then 方法来实现对异步操作的处理,在处理过程中可能会出现错误或者未被处理的 Promise 异常。为了更好地处理这些异常,ES6 添加了 unhandledrejection 事件。

概述

当 Promise 未被处理时,其可能会抛出异常,这些异常需要通过 unhandledrejection 事件进行捕获和处理。unhandledrejection 事件会在 Promise 异常被抛出后立即触发,并且该事件是 Promise 对象本身的一个属性,可以通过 Promise 对象静态方法添加监听器。

具体实现方法如下:

此时当任一 Promise 对象抛出未被链式处理的异常时,该事件会立即触发,可以在此处捕获、记录错误信息,避免出现未处理的异常。

深度解析

由于 Promise 对象是一种异步的处理方式,因此其可能在数据加载、接口请求等等操作过程中发生各种异常,在处理这些异常时就需要进行深入了解 Promise 对象的相关知识。

Promise 对象是一种处理异步操作的语法规范,其本质是一组状态机。具体包括以下三种状态:

  • Pending:表示每个 Promise 对象实例的初始状态,表示 Promise 的状态未决定,和 Promise 正在被执行中这两个状态之间的过渡状态;
  • Fulfilled:表示 Promise 对象实例已成功执行,与 Pending 中的状态相对应;
  • Rejected:表示 Promise 对象实例已执行失败,与 Pending 中的状态相对应。

在以下例子中,将会使用 XMLHttpRequest 创建一个 Promise 对象,其中 withCredentials=true 表示携带跨域参数,promise 对象在请求完成后会开启一个定时器来模拟阻塞事件,即在 5 秒钟内没有响应,便会抛出 unhandledrejection 异常:

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

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

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

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

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

在此时,我们可以添加 unhandledrejection 事件的监听,来捕获 promise 异常:

在请求过程中,如果出现了异常,事件监听器的执行结果如下图:

在此基础上,我们再来改写一下代码,将 promise 携带的异常信息更具体化:

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

这样,当异常被触发时,我们还可以进一步对异常进行分类并处理。

指导意义

unhandledrejection 事件可以帮助我们及时地捕获 Promise 中的未处理异常,从而避免出现因为 Promise 异常未被及时处理而导致程序崩溃的情况,在为开发者节省调试时间的同时,也提高了前端代码的稳定性。

而且,在实际生产环境中,这种捕获异常的方式可以很好地进行错误日志上报,使得我们的前端开发人员能够更加快速地发现问题并解决问题。

总结

Promise 对象是一种异步的处理方式,在完成异步操作的时候可能会出现异常,为了更好地捕获和处理这些异常,ES6 添加了 unhandledrejection 事件。通过监听该事件,我们可以及时地发现 Promise 异常并进行处理,从而提高代码稳定性和开发效率。

示例代码:

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

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

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

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

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

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

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ed9a84f6b2d6eab37c0c36

纠错
反馈