据我所知并纠正我,如果我错了,redux-thunk是一个中间件,它可以帮助我们在动作中调度异步函数和调试值,而当我使用redux-promise时,我无法创建异步函数而不实现我自己的机制,因为Action抛出了仅调度普通对象的异常。
这两个套餐之间的主要区别是什么?在单页反应应用中使用这两个包还是坚持使用redux-thunk有什么好处就足够了?
答案 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生成并发送承诺,那么您将希望同时使用这两个库:
redux-promise
会在你的Thunk生成的各个promise(你)中解包,以避免需要的样板。 (你可以代替Thunks做所有事情,promise.then(unwrapAndDispatchResult).catch(unwrapAndDispatchError)
......但你为什么要这样做?)总结用例差异的另一种简单方法: Redux操作周期的开头与结束:
redux-promise
适用于 end
你的流程,一旦所有的东西都归结为简单的承诺,你只想打开它们并将其解决/拒绝的价值存储在商店中
redux-promise-middleware
是原始redux-promise
背后的理念的更完整和可理解的实现。它正在积极开发中,并且redux-promise-reducer
也很好地补充了它。 redux-saga
,它与redux-thunk
非常相似,但它基于生成器函数的语法。同样,您可能会将其与redux-promise
一起使用。答案 2 :(得分:21)
完全披露:我对Redux开发相对较新,并且自己也在努力解决这个问题。我会解释一下我发现的最简洁的答案:
ReduxPromise在调度操作时返回promise作为有效负载,然后ReduxPromise中间件用于解析该promise并将结果传递给reducer。
另一方面,ReduxThunk强制动作创建者暂停实际将动作对象分派给reducer,直到调用dispatch为止。
以下是我发现此信息的教程链接:https://blog.tighten.co/react-101-part-4-firebase。