JavaScript Promise 中 then、catch 链式调用详解

阅读时长 6 分钟读完

JavaScript Promise 是一种异步编程解决方案,它可以让我们更加方便地处理异步操作中的成功和失败两种情况。在 Promise 中,then 和 catch 是最常用的两种方法,它们可以让我们在异步操作完成后处理相应的结果。在本文中,我们将详细讲解 then 和 catch 的链式调用用法。

then 方法

在 Promise 中,then 方法用于注册成功时的回调函数,它的语法如下:

其中,onResolved 表示成功时的回调函数,onRejected 表示失败时的回调函数。具体来说,当 promiseObj 状态值变为成功时,就会调用 onResolved 函数;当状态值变为失败时,则会调用 onRejected 函数。

then 方法的返回值是一个新的 Promise 对象,因此我们可以通过链式调用的方式继续注册 then 方法来处理回调函数返回的结果。例如,假设我们有一个异步操作用于获取用户信息:

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

我们可以通过 then 方法来处理成功和失败两种情况:

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

上面的代码中,我们首先调用 getUserInfo 方法获取用户信息。当用户信息获取成功后,会通过 then 方法中的回调函数进行处理。这里,我们将用户名称作为返回值传递给下一个 then 方法,从而实现链式调用。最后,如果有任何一个 then 方法中出现异常,都会通过 catch 方法来进行处理。

值得注意的是,then 方法中的回调函数不仅可以返回普通值,还可以返回一个 Promise 对象。此时,下一个 then 方法会等待这个 Promise 对象的状态变化后再进行处理。例如:

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

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

在上面的例子中,我们首先通过 fetch 方法来获取用户信息。当数据获取成功后,我们将用户名打印出来,并返回一个 Promise 对象。在该 Promise 的回调函数中,我们模拟等待 1 秒钟后返回一个成功的消息。最后,我们在第二个 then 方法中打印出这个消息。

catch 方法

如果 Promise 的状态值变为失败,我们可以通过 catch 方法来处理相应的错误。catch 方法用于注册失败时的回调函数,其语法如下:

其中,onRejected 表示失败时的回调函数。如果在 Promise 中出现异常,或者 Promise 被 reject 时,就会调用 onRejected 函数。

和 then 方法一样,catch 方法的返回值也是一个新的 Promise 对象,因此我们也可以通过链式调用的方式来处理多个 catch 方法。例如:

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

在上面的例子中,我们首先调用 getUserInfo 方法获取用户信息。当 userId 不为 1 时,Promise 就会被 reject。此时,我们可以通过 catch 方法来捕获异常,并返回 'Unknown user'。之后,我们再次使用 then 方法来打印消息,再通过一个 catch 方法来处理潜在的异常情况。

异常处理

如果在 then 方法中出现错误,就会根据注册的回调函数来处理相应的异常。例如:

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

在上面的例子中,我们在 then 方法中手动抛出一个异常。此时,Promise 的状态值变为失败,就会调用 catch 方法中的回调函数。在该回调函数中,我们打印出异常信息,并返回 'Unknown user'。之后,我们再次使用 then 方法来打印消息,再通过一个 catch 方法来处理潜在的异常情况。

结论

通过 then 和 catch 方法的链式调用,我们可以更加方便地处理异步操作的回调函数。如果需要在异步操作中处理多个回调函数,我们可以通过链式调用的方式来继续注册 then 方法。如果在这个过程中出现了异常,就可以通过 catch 方法来处理相应的错误。请务必注意基础语法和异常处理,让异步编程变得更加轻松和高效。

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

纠错
反馈