Redux 技巧:如何替换 redux-thunk

阅读时长 6 分钟读完

如果您正在开发 React 应用程序并使用 Redux,那么您一定听说过 redux-thunk。它是一个 Redux 中间件,允许您编写异步的 action creators,这些 action creators 可以返回一个函数而不是一个普通的 action 对象。但是,您知道吗?您可以使用其他方法来处理异步流程而不必依赖 redux-thunk。在本篇文章中,我们将探讨如何替换 redux-thunk,并提供一些示例代码。

1. 基于 Promise 的中间件

一个不依赖 redux-thunk 的替代方案是基于 Promise 的中间件。这种中间件可以让您的 action creators 返回 Promise,从而将异步流程处理从 Redux store 中分离出来。不仅如此,它还可以让您更好地控制 Promise 的生命周期,例如处理错误和超时。

下面是一个基于 Promise 的中间件示例:

它允许您编写像这样的 action creator:

这个 action creator 返回一个函数而不是一个 action 对象,但是返回的函数返回的是一个 Promise。在这个例子中,fetchData 会发起一个 HTTP 请求,并在请求成功后将数据 dispatch 到 Redux store 中。

通过使用上面的 promiseMiddleware,它将识别到 fetchData 的结果是一个 Promise,它会等待 Promise 执行完成并将结果 dispatch 到 Redux store 中。

2. 基于 async/await 的中间件

async/await 是一种 JavaScript 特性,它可以让您更方便地编写异步代码。为了使用 async/await,您需要使用一个带有 async 关键字修饰符的异步函数。在 Redux 中,您可以使用基于 async/await 的中间件来处理异步流程。

下面是一个基于 async/await 的中间件示例:

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

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

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

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

这个中间件基于 action.types,监听所有以 ASYNC 结尾的 action,并将其传递到下一个 middleware 或 Redux store。如果 action 的类型是以 ASYNC 结尾的,asyncMiddleware 就会发起一个新的 action,例如 START 或 ERROR,以反映异步操作的状态。然后,它会等待 Promise 解析,然后 dispatch 我一个新的 action 来传递异步操作的结果。

3. 使用 Sagas

Sagas 是 Redux 的第三方库,它延伸了 Redux 的理念以支持更高级别的中间件应用程序。Sagas 将异步操作看作是一个可交互的事务,并使用一组生成器函数来描述这些事务。这可以让您控制异步操作的生命周期,并让它们更具预测性。

下面是一个 Saga 示例:

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

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

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

这里,我们定义了两个生成器函数:一个处理异步数据获取的 fetchData 和一个监听 FETCH_DATA_ASYNC action 的 watchFetchData。在 fetchData 中,我们使用 call 效用函数来调用异步 API,并使用 put 效用函数将数据 dispatch 给 Redux store。在 watchFetchData 中,我们使用 Saga 的 takeEvery 函数来监听 FETCH_DATA_ASYNC action,以启动 fetchData。

结论

Redux-thunk 是一种流行的 Redux 中间件,让我们可以更好的处理异步行为,但是我们也可以使用其他替代方案来处理异步行为。本文介绍了一些可供选择的 Redux 中间件,包括基于 Promise 的中间件、基于 async/await 的中间件以及 Sagas。选择合适的替代方案可以使您的代码更简洁而且更可读,同时也可以更好的控制您的异步行为生命周期。

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

纠错
反馈