redux-thunk 和 redux-promise 有什么区别?

IT技术 reactjs redux redux-thunk redux-promise
2021-04-06 10:40:42

据我所知,如果我错了,请纠正我,redux-thunk是一个中间件,它可以帮助我们调度异步函数并调试操作本身的值,而当我使用redux-promise 时,我无法在没有实现自己的情况下创建异步函数机制作为 Action 抛出仅调度普通对象的异常。

这两个包之间的主要区别是什么?在单页react应用程序中使用这两个包或坚持使用 redux-thunk 是否有任何好处?

3个回答

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

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

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

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

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

很好的答案。我可能会补充说,thunk 可以被认为是一个轻量级的Promise。它有助于在管理异步操作时规范时间。
2021-06-01 10:40:42
如果您使用 Promise,则可以将 async/await 与 action creators 一起使用
2021-06-15 10:40:42

您可能希望/需要在您的应用程序中同时使用。从 redux-promise 开始用于常规的 Promise 生成异步任务,然后随着复杂性的增加而扩展以添加 Thunks(或 Sagas 等)

  • 当生活很简单,并且您只是与返回单个Promise的创作者一起进行基本的异步工作时,那么redux-promise将改善您的生活并简化它,快速而轻松。(简而言之,您不需要考虑在解决时“解开”您的Promise,然后编写/分发结果,redux-promise(-middleware) 会为您处理所有无聊的事情。)
  • 但是,在以下情况下,生活会变得更加复杂:
    • 也许你的动作创建者想要产生几个Promise,你想将它们作为单独的动作分派给单独的减速器?
    • 或者,在决定如何以及在何处分发结果之前,您需要管理一些复杂的预处理和条件逻辑?

在这些情况下,的好处redux-thunk是它允许您将复杂性封装在 action-creator 中

但请注意,如果您的 Thunk 生成并分发Promise,那么您将需要同时使用这两个库

  • Thunk 将组成原始动作并发送它们
  • redux-promise然后将处理在减速器处解开由您的 Thunk 生成的单个Promise,以避免需要的样板。(你可以在 Thunks 中做所有事情,用promise.then(unwrapAndDispatchResult).catch(unwrapAndDispatchError)......但你为什么要这样做?)

总结用例差异的另一种简单方法:Redux 操作周期的开始与结束

  • Thunk 用于Redux 流程开始:如果您需要创建一个复杂的动作,或者封装一些粗糙的动作创建逻辑,将它放在你的组件之外,绝对不要放在 reducer 之外。
  • redux-promise是为了你的流程结束,一旦一切都归结为简单的Promise,你只想解开它们并将它们的已解决/拒绝值存储在商店中

注释/参考:

  • 我发现redux-promise-middleware这是对原始想法的更完整和更易于理解的实现redux-promise它正在积极开发中,并且也很好地补充了redux-promise-reducer.
  • 还有其他类似的中间件可用于组合/排序您的复杂操作:一个非常流行的中间件是redux-saga,它与 非常相似redux-thunk,但基于生成器函数的语法。同样,您可能会将它与redux-promise.
  • 这是一篇很棒的文章,直接比较了各种异步组合选项,包括 thunk 和 redux-promise-middleware。(TL;DR:“与其他一些选项相比,Redux Promise Middleware 大大减少了样板文件” ...... “我想我喜欢 Saga 用于更复杂的应用程序(阅读:“使用”),而 Redux Promise Middleware 用于其他一切。” )
  • 请注意,在一个重要的情况下,您可能认为需要分派多个操作,但实际上不需要,您可以使简单的事情保持简单。这就是您只希望多个减速器对您的异步调用做出react的地方。但是,完全没有理由为什么多个减速器不能监视单个动作类型。您只想确保您的团队知道您正在使用该约定,因此他们不会假设只有一个减速器(具有相关名称)可以处理给定的操作。
很好的解释!图书馆的数量之多简直让人热血沸腾。:)
2021-06-21 10:40:42

完全披露:我对 Redux 开发相对较新,并且自己也在这个问题上挣扎。我将解释我找到的最简洁的答案:

ReduxPromise 在调度 action 时返回一个 promise 作为负载,然后 ReduxPromise 中间件会解析该 promise 并将结果传递给 reducer。

另一方面,ReduxThunk 强制动作创建者推迟将动作对象实际分派给减速器,直到调用分派。

这是我找到此信息的教程链接:https : //blog.tighten.co/react-101-part-4-firebase

...有点这些是使用的实际模式的……副作用……。ReduxPromise 也不会返回Promise作为有效负载。ReduxPromise处理您调度的任何操作,其中Promise有效负载。
2021-06-07 10:40:42