Promise 中的 unhandledrejection 事件详解
Promise 是 JavaScript 中处理异步操作的一种解决方案。它是 ES6 中新增的语法规范,它通过一系列 then 方法来实现对异步操作的处理,在处理过程中可能会出现错误或者未被处理的 Promise 异常。为了更好地处理这些异常,ES6 添加了 unhandledrejection 事件。
概述
当 Promise 未被处理时,其可能会抛出异常,这些异常需要通过 unhandledrejection 事件进行捕获和处理。unhandledrejection 事件会在 Promise 异常被抛出后立即触发,并且该事件是 Promise 对象本身的一个属性,可以通过 Promise 对象静态方法添加监听器。
具体实现方法如下:
Promise.onunhandledrejection = function (event) { console.log(event); };
此时当任一 Promise 对象抛出未被链式处理的异常时,该事件会立即触发,可以在此处捕获、记录错误信息,避免出现未处理的异常。
深度解析
由于 Promise 对象是一种异步的处理方式,因此其可能在数据加载、接口请求等等操作过程中发生各种异常,在处理这些异常时就需要进行深入了解 Promise 对象的相关知识。
Promise 对象是一种处理异步操作的语法规范,其本质是一组状态机。具体包括以下三种状态:
- Pending:表示每个 Promise 对象实例的初始状态,表示 Promise 的状态未决定,和 Promise 正在被执行中这两个状态之间的过渡状态;
- Fulfilled:表示 Promise 对象实例已成功执行,与 Pending 中的状态相对应;
- Rejected:表示 Promise 对象实例已执行失败,与 Pending 中的状态相对应。
在以下例子中,将会使用 XMLHttpRequest 创建一个 Promise 对象,其中 withCredentials=true 表示携带跨域参数,promise 对象在请求完成后会开启一个定时器来模拟阻塞事件,即在 5 秒钟内没有响应,便会抛出 unhandledrejection 异常:
-- -------------------- ---- ------- --- --- - -------------- --- --- - --- ----------------- --------------- ---- ------ ------------------- - ----- --- ------- - --- ------------------------- ------- - ---------------------- - ---------- - -- --------------- -- -- - -- ----------- -- ---- - -------------------------- - ---- - --------------------- - - -- ----------- - ----- ------------- - ---------- - --------------- ----- ------ -- ----------- - -- -- - --------------- ------- -------- -- ----------- --- ---------------- -- - ----------------- ------------ -- - ------------------ ---
在此时,我们可以添加 unhandledrejection 事件的监听,来捕获 promise 异常:
Promise.onunhandledrejection = function(opts) { console.warn('Unhandled Rejection:', opts.reason); };
在请求过程中,如果出现了异常,事件监听器的执行结果如下图:
在此基础上,我们再来改写一下代码,将 promise 携带的异常信息更具体化:
-- -------------------- ---- ------- ---------------------------- - -------------- - ----------------------- ------------ ------------- -- ------------ ---------- ---------- - --------------------- --------- -------- --- --- ------------ - -- ------------ ---------- ------------ - --------------------- --------- -------- --- --- -------------- - --
这样,当异常被触发时,我们还可以进一步对异常进行分类并处理。
指导意义
unhandledrejection 事件可以帮助我们及时地捕获 Promise 中的未处理异常,从而避免出现因为 Promise 异常未被及时处理而导致程序崩溃的情况,在为开发者节省调试时间的同时,也提高了前端代码的稳定性。
而且,在实际生产环境中,这种捕获异常的方式可以很好地进行错误日志上报,使得我们的前端开发人员能够更加快速地发现问题并解决问题。
总结
Promise 对象是一种异步的处理方式,在完成异步操作的时候可能会出现异常,为了更好地捕获和处理这些异常,ES6 添加了 unhandledrejection 事件。通过监听该事件,我们可以及时地发现 Promise 异常并进行处理,从而提高代码稳定性和开发效率。
示例代码:
-- -------------------- ---- ------- --- --- - -------------- --- --- - --- ----------------- --------------- ---- ------ ------------------- - ----- --- ------- - --- ------------------------- ------- - ---------------------- - ---------- - -- --------------- -- -- - -- ----------- -- ---- - -------------------------- - ---- - --------------------- - - -- ----------- - ----- ------------- - ---------- - --------------- ----- ------ -- ----------- - -- -- - --------------- ------- -------- -- ----------- --- ---------------------------- - -------------- - ----------------------- ------------ ------------- -- ------------ ---------- ---------- - --------------------- --------- -------- --- --- ------------ - -- ------------ ---------- ------------ - --------------------- --------- -------- --- --- -------------- - -- ---------------- -- - ----------------- ------------ -- - ------------------ ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ed9a84f6b2d6eab37c0c36