乐闻世界logo
搜索文章和话题

React 状态管理 redux-thunk 和 redux-promise 有什么区别?

2个答案

1
2

Redux-thunk 和 redux-promise 都是用于在 Redux 状态管理库中处理异步操作的中间件,但它们在处理异步动作时的方式存在差异。以下是它们各自的特点和区别:

Redux-thunk

特点:

  • Redux-thunk 是一个中间件,允许我们在 action creators 里面创建返回函数而不是返回 action 对象的能力。
  • 这个返回的函数接收 dispatchgetState 作为参数,可以执行异步操作,并且在操作完成后手动调用 dispatch
  • Thunk 是一个允许我们写更多复杂异步逻辑的工具,包括序列化的异步调用、延迟异步调用等。

例子:

javascript
// Action creator 返回一个函数(thunk) export const fetchData = () => { return (dispatch, getState) => { dispatch({ type: 'FETCH_DATA_REQUEST' }); return fetch('/my-api-endpoint') .then(response => response.json()) .then(data => dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data })) .catch(error => dispatch({ type: 'FETCH_DATA_FAILURE', error })); }; };

在上面的例子中,fetchData 函数不是返回一个 action 对象,而是返回一个函数。这个函数可以执行异步请求并在请求完成后通过 dispatch 发送一个新的 action。

Redux-promise

特点:

  • Redux-promise 是另一种 Redux 异步中间件,它专注于处理返回 promise 对象的 action。
  • 当一个 action creator 返回一个 promise 时,redux-promise 中间件会等待这个 promise 解决,并且自动发送一个带有解决值的 action 或者在 promise 被拒绝时发送一个带有错误信息的 action。

例子:

javascript
// Action creator 返回一个携带 promise 的 action 对象 export function fetchData() { return { type: 'FETCH_DATA', payload: fetch('/my-api-endpoint').then(response => response.json()) }; };

在这个例子中,fetchData 函数返回一个包含 typepayload 的 action 对象。 payload 是一个 promise,由 redux-promise 自动处理。

区别

  1. 返回值:

    • Redux-thunk 允许 action creators 返回函数(thunk),这些函数可以执行任何异步逻辑并调用 dispatch
    • Redux-promise 要求 action creators 返回一个 promise 作为 payload 的 action 对象。
  2. 复杂异步流程控制:

    • Redux-thunk 可以实现更复杂的异步流程控制,如条件分支、延迟异步调用、连续异步调用等。
    • Redux-promise 对异步控制的支持较为简单,主要是针对单一的异步操作。
  3. 易用性:

    • Redux-thunk 提供的灵活性更高,但是需要开发者手动处理 dispatch。
    • Redux-promise 使用起来更简单,只需返回 promise 即可,但它的灵活性不如 thunk。

综上所述,redux-thunk 提供了对异步操作更精细和复杂控制的能力,而 redux-promise 则提供了一种简洁的处理异步请求的方式,适用于更简单的场景。开发者可以根据实际项目需求选择最合适的工具。

2024年6月29日 12:07 回复

redux-thunk允许您的动作创建者返回一个函数:

shell
function myAction(payload){ return function(dispatch){ // use dispatch as you please } }

redux-promise允许他们返回一个承诺:

shell
function myAction(payload){ return new Promise(function(resolve, reject){ resolve(someData); // redux-promise will dispatch someData }); }

如果您需要异步或有条件地分派操作,这两个库都很有用。redux-thunk还允许您在一个动作创建器中多次调度。无论您选择其中之一、另一个还是两者都完全取决于您的需求/风格。

2024年6月29日 12:07 回复

你的答案