Promise.reject() 的使用场景及如何正确处理错误

阅读时长 8 分钟读完

Promise 对象是现代前端开发中非常重要的异步编程解决方案,而 Promise.reject() 是其中一个重要的函数之一。它的作用是返回一个被拒绝(rejected)的 Promise 对象,也就是说,它会让一个 Promise 失败并返回一个拒绝原因(reject reason)。本文将着重探讨 Promise.reject() 的使用场景及如何正确处理错误。

Promise.reject() 的使用场景

在实际开发中,我们常常需要对异步操作的结果进行判断,在某些情况下,当条件不满足时,需要让 Promise 拒绝,并返回一个拒绝原因。这时就需要使用 Promise.reject()。例如:

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

这段代码中,fetch() 方法向服务器发起请求,并返回一个 Promise 对象。在处理服务器响应时,我们进行了一次判断,如果响应状态码不是 200,就使用 Promise.reject() 拒绝 Promise 并返回一个字符串 'fetch failed' 作为拒绝原因。这样在后续的 Promise 链式调用中,将会执行 catch() 方法,并在控制台显示错误信息。

另一个使用场景是当需要同时请求多个接口数据时,如果其中有一个接口请求失败了,我们希望整个 Promise 链都失败并返回错误信息,就可以使用 Promise.all() 方法配合 Promise.reject() 来实现:

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

在这段代码中,我们调用了 Promise.all() 方法将三个 Promise 对象合并,在 then() 方法中对响应结果进行了判断,如果有一个响应状态码不是 200,就使用 Promise.reject() 拒绝 Promise 并返回错误信息。在 Promise 链中,后续的处理方式取决于我们自己的业务需求,这里仅仅是打印出错误信息。

如何正确处理错误

在实际开发中,错误处理是非常重要的。当 Promise 对象被拒绝时,往往是由于某些异常情况导致的,而不同的异常情况需要不同的处理方式。以下是建议的错误处理方式:

明确错误类型

在设计 Promise 的时候,我们应该划分出不同的错误类型,以便在出现异常情况时,能够快速准确地定位到错误的类型。例如:

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

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

这里我们定义了三种错误类型:网络错误、API 错误、业务错误。在请求数据时,我们根据响应状态码和业务状态码,抛出不同类型的错误并将错误信息挂载到错误对象上,便于后续处理时做进一步判断。

级别不同的处理方式

在前面的示例中,我们使用了 console.error() 打印错误信息。实际开发时,我们需要针对不同的错误类型,采用不同的处理方式,比如在发生网络错误时,需要给用户提示网络异常,请稍后重试;而在业务错误时,需要提示用户业务异常,给出具体的解决方法。

合理地传递错误信息

在处理错误时,有时需要将错误信息传递到对应的调用处,以便进一步处理错误信息。在 Promise 对象在一系列的处理之后会调用 catch() 方法,将错误信息传递给调用者。在实际开发中,我们可以利用这种方式将错误信息传递到最外层处理。例如:

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

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

在这段代码中,我们仍然是先在 Promise 链中处理错误,并恰当地传递错误信息。然后在 Promise 链外部使用 catch() 方法捕获 Promise 拒绝的错误,从而能够将错误信息传递给外部。

总结

在异步编程中,Promise.reject() 发挥着重要的作用,帮助我们将 异步错误 明确地传递到 Promise 链的 catch() 方法中,并进行处理。在使用 Promise.reject() 时,我们需要明确错误类型、采用不同的处理方式、合理地传递错误信息。只有这样,我们才能迅速准确地解决异步编程中的异常情况。

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

纠错
反馈