Redux-Saga:如何在 Redux 应用中使用

阅读时长 9 分钟读完

Redux-Saga:如何在 Redux 应用中使用

Redux-Saga 是一个用于管理应用程序副作用(例如异步数据获取和不纯的操作)的 Redux 中间件。它允许您通过利用 ES6 的生成器功能创建可重用的异步逻辑来处理这些副作用。本文将讲解如何在 Redux 应用中使用 Redux-Saga。

安装

首先,您需要安装 Redux-Saga。您可以通过 npm 进行安装:

或者你可以使用 yarn 安装:

使用

添加 middleware

将 Redux-Saga 添加到您的 Redux 中间件中。您可以使用 redux-saga 提供的中间件函数 applyMiddleware。在创建 store 的时候,将 Redux-Saga 添加到中间件队列中:

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

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

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

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

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

其中,rootSaga 是一个生成器函数。我们将在下文中讨论如何编写 rootSaga。

编写 Saga

一个 Saga 是一个生成器函数,用于拦截 Redux 动作并为其提供额外的行为。Saga 可以发起任意数量的异步操作,并可以处理来自多个源的并行并行活动。以下是 Saga 生成器函数的示例:

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

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

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

这个 Saga 提供一个拦截名为 GET_USER 的动作的方式。在拦截到这个动作之后,它会调用 getUserDataFlow 函数。

getUserDataFlow 函数是一个生成器,它将使用 call 指令调用名为 getUserData 的外部 API 函数,以获取用户数据。这个函数还将捕获任何在调用期间可能发生的错误,并将 use put 指令触发 getUserSuccess 或 getUserFailure 动作。

在 watchGetUserData 函数中, 我们使用 takeLatest 指令创建了一个非阻塞的 dispatch 最新请求的模式。如果用户多次点击“获取用户”按钮,takeLatest 只会处理最新的请求,并忽略较旧的请求。

在这个例子中,我们假设 getUserData 是在 api.js 文件中定义的函数,它使用 fetch API 从某个 URL 获取数据。你可以在你的应用中使用 axios、jQuery 或其他的 HTTP 库来获取异步数据。

Watcher Saga

在 Redux-Saga 中,需要至少一个 Watcher 为您的 Saga 提供监听。Watcher Saga 是一个生成器函数,它监听 Redux 动作。这个 Saga 的主要功能是为其子 Saga(我们将在下文中介绍)提供启动和停止功能。

例如:

所有的 Saga 都被放在 all() 函数中,以在启动时并行处理。

三种类型的 Saga

由于 Redux-Saga 可以处理多个异步操作,因此 Saga 可以分类为三种类型:阻塞、非阻塞和单次。

阻塞

阻塞型 Saga 会等待每个异步操作完成后才能继续处理下一步。这是 Redux-Saga 的默认行为。阻塞型 Saga 可能是您的一个子 Saga,因此 Watcher Saga 需要管理它们的生命周期。

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

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

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

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

阻塞型 Sagas 的例子包括等待维护幂等序列生成器的循环更改,或等待异步完成的拍卖模块。

非阻塞

非阻塞的 Saga 允许多个异步操作同时进行。当两个异步操作几乎同时发生(例如,当应用程序同时获取第一帧和第二帧时),非阻塞 Saga 可以同时处理它们。

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

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

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

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

非阻塞 Saga 的一个例子是在 Reels 视频轮播的两个轨道上同时根据时间戳启动音频并行播放。

单次

单次 Saga 类似于非阻塞 Saga,但只允许一个异步操作同时进行。这可以确保数据不会并发传输,从而减少了应用程序的负载。

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

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

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

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

单次 Saga 的例子是长轮询从服务器获取消息的聊天应用程序。

总结

Redux-Saga 是一个可重用的副作用管理中间件,可以处理在 Redux 应用程序中发生的异步操作和不纯操作。您可以使用 Redux-Saga 作为 Generator 函数创建可读性高且易于管理的异步代码。本文介绍了如何将 Redux-Saga 添加到 Redux 应用程序中,并创建了三种类型的 Saga,阻塞、非阻塞和单次。通过利用 Redux-Saga 的强大功能,您可以编写易于维护并具有优秀用户体验的 React 应用程序。

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

纠错
反馈