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

时间:2016-04-12 15:19:20

标签: reactjs redux redux-thunk redux-promise

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

这两个套餐之间的主要区别是什么?在单页反应应用中使用这两个包还是坚持使用redux-thunk有什么好处就足够了?

3 个答案:

答案 0 :(得分:101)

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

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

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

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

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

答案 1 :(得分:71)

您可能希望/需要在您的应用中同时使用这两者。 从生成异步任务的例行承诺开始使用redux-promise,然后随着复杂性的增加而扩展以添加Thunk(或Sagas等)

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

在这些情况下, redux-thunk的好处是它允许您将复杂性封装在您的动作创建者中。

但请注意如果您的Thunk生成并发送承诺,那么您将希望同时使用这两个库

  • Thunk将组成原始行动并发送给他们
  • 然后
  • redux-promise会在你的Thunk生成的各个promise(你)中解包,以避免需要的样板。 (你可以代替Thunks做所有事情,promise.then(unwrapAndDispatchResult).catch(unwrapAndDispatchError) ......但你为什么要这样做?)

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

  • Thunks用于Redux流程的开始:如果您需要创建复杂的操作,或封装一些粗糙的动作创建 逻辑,使它远离你的组件,绝对是减速器。
  • redux-promise适用于 end 你的流程,一旦所有的东西都归结为简单的承诺,你只想打开它们并将其解决/拒绝的价值存储在商店中

NOTES / REFS:

  • 我发现redux-promise-middleware是原始redux-promise背后的理念的更完整和可理解的实现。它正在积极开发中,并且redux-promise-reducer也很好地补充了它。
  • 还有其他类似的中间件可用于编写/排序您的复杂动作:一个非常流行的是redux-saga,它与redux-thunk非常相似,但它基于生成器函数的语法。同样,您可能会将其与redux-promise一起使用。
  • 这是一个great article直接比较各种异步组合选项,包括thunk和redux-promise-middleware。 (TL; DR:“Redux Promise Middleware相对于其他一些选项显着降低了样板” ... “我认为我更喜欢Saga用于更复杂的应用程序(阅读: “使用”),和Redux承诺中间件用于其他一切。“
  • 请注意,在一个重要的情况下,您可能认为需要调度多个操作,但实际上并非如此,并且您可以保持简单的事情。这就是你想要多个Reducer对你的异步调用作出反应的地方。但是,根本没有理由为什么多个Reducer无法监视单个动作类型。您只是想确保您的团队知道您正在使用该约定,因此他们不会假设只有一个reducer(具有相关名称)可以处理给定的操作。

答案 2 :(得分:21)

完全披露:我对Redux开发相对较新,并且自己也在努力解决这个问题。我会解释一下我发现的最简洁的答案:

ReduxPromise在调度操作时返回promise作为有效负载,然后ReduxPromise中间件用于解析该promise并将结果传递给reducer。

另一方面,

ReduxThunk强制动作创建者暂停实际将动作对象分派给reducer,直到调用dispatch为止。

以下是我发现此信息的教程链接:https://blog.tighten.co/react-101-part-4-firebase