Redux 中如何使用 Promise?

阅读时长 8 分钟读完

在使用 Redux 进行状态管理的过程中,我们经常需要处理异步操作。而 Promise 是一种非常方便处理异步操作的方式。在 Redux 中,我们可以通过 Redux-Thunk、Redux-Saga 等中间件将异步操作纳入到 Redux 的流程中,本文将着重介绍在 Redux 中如何使用 Promise 来处理异步操作。

为什么要使用 Promise?

在之前的 Redux 应用中,我们往往需要手动处理异步操作,例如使用回调函数来处理。这种方式虽然实现起来简单,但是不够直观,且会造成回调函数嵌套的问题。

Promise 则为我们提供了一种更加直观、简洁的方式来处理异步操作。Promise 本身就是一种对象,可以直接返回或者作为参数传递,避免了回调函数嵌套的问题,同时也增加了代码的可读性。

Redux 中使用 Promise

在 Redux 中使用 Promise,需要我们首先了解 Redux 的三大基础概念:Action、Reducer 和 Store。我们需要将异步操作拆分为以下两步:

  1. Action:将异步操作的状态和对应的数据封装为一个 Action,并派发给 Reducer。
  2. Reducer:根据接收到的 Action 更新 Store 中的状态。

Redux-Thunk

Redux-Thunk 是一个非常常用的 Redux 中间件,可以让我们的 Action Creator 返回一个函数,而不是一个对象。这个函数将接收到 Redux 的 dispatch 和 getState 方法。

在这个函数中,我们可以直接调用异步 API,并把结果作为一个新的 Action 派发给 Reducer。通常,这里会使用 Promise 来处理异步操作。

这里是一个使用 Redux-Thunk 来处理异步操作的示例:

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

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

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

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

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

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

在上述示例中,fetchData 是一个 Action Creator 函数,它返回一个函数,这个函数接收 dispatch 方法,并返回一个 Promise。在这个函数内部,我们可以像处理普通的异步操作一样,使用 fetch 来获取数据。如果获取数据成功,我们就可以将数据通过 dispatch 方法派发一个名为 FETCH_DATA_SUCCESS 的 Action;如果获取失败,则派发 FETCH_DATA_FAILURE 的 Action。

Redux-Saga

Redux-Saga 是另一个非常流行的 Redux 中间件,它提供了更加强大的异步操作处理能力。它采用了一种称为 Generator 的函数来实现同步化的处理异步操作。

在 Redux-Saga 中,我们可以将异步操作拆分为多个步骤,同时还可以轻松处理一些很难用 thunk 实现的复杂异步操作。以下是一个使用 Redux-Saga 来处理异步操作的示例:

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

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

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

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

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

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

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

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

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

在上述示例中,我们首先定义了一个名为 fetchData 的 Generator 函数,它通过 call 和 put 的方式执行了两步异步操作。第一步,调用 fetch 方法获取数据,如果成功则执行第二步,将获取到的数据通过 put 方法派发一个名为 FETCH_DATA_SUCCESS 的 Action。

另外,我们还定义了一个 Generator 函数 watchFetchData,在这个函数中通过 takeLatest 监听名为 FETCH_DATA_REQUEST 的 Action。这样当我们派发 FETCH_DATA_REQUEST Action 时,就会触发 watchFetchData 函数中的 fetchData 函数。

总结

在 Redux 应用中,Promise 是一种非常方便处理异步操作的方式。我们可以使用 Redux-Thunk 或者 Redux-Saga 来将异步操作纳入到 Redux 的流程中。Redux-Thunk 适用于较简单的异步操作,Redux-Saga 则更加适用于复杂的异步操作,同时也提供了更加强大的能力。在应用中需要酌情选择。

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

纠错
反馈