redux-thunk和redux-promise有什么区别?
据我所知,纠正我,如果我错了, redux-thunk是一个中间件,它可以帮助我们在动作本身调度asynchronous函数和debugging值,而当我使用了redux-promise时,我不能创buildasynchronous函数,而不实现我自己的机制作为Action引发只调度普通对象的exception。
这两个软件包的主要区别是什么? 在单个页面反应应用程序中使用这两个软件包还是有一些好处,或者坚持使用redux-thunk就足够了?
redux-thunk
允许您的动作创build者返回一个函数:
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-thunk will dispatch someData }); }
如果您需要asynchronous或有条件地分派操作,这两个库都很有用。 还可以让您在一个动作创build者内多次分派。 无论你select一个,其他或完全取决于你的需求/风格。
你可能想/需要你的应用程序在一起。 至于什么时候可以利用每一个,我从复杂性的angular度来考虑:
- 如果你只需要派遣一个单一的承诺(也许是networking调用),那么承诺可以解开,解决的价值用最less的样板写入商店,那么
redux-promise
就能解决这个问题。 - 如果您在调度1个或多个承诺之前有更复杂的pipe理工作,则可以使用
redux-thunk
来封装复杂性。 例如,如果你想构造一个有条件的承诺链,然后只发送最终的结果,使用一个Thunk。 或者,如果您想一次发送多个承诺,请使用Thunk。 但是要注意的是,无论哪种情况,你都要一起使用:Thunk将组成序列,然后使用redux-promise
处理序列产生的个体promise,避免展开networking响应的样板,然后调度到商店。 - 总结差异的一个简单方法是:thunk(或sagas,或类似的)允许您分派多个动作来响应单个原始动作或asynchronous调用。 所以,当你需要多个下游行动,你可能会想要一个thunk或传奇或类似的。 但是,如果你不这样做,保持简单的生活,并使用redux-promise(-middleware)。
NOTES / REFS:
- 我发现
redux-promise-middleware
是原始的redux-promise
背后的一个更完整和可理解的实现。 目前正处于积极的发展阶段,并且还有redux-promise-reducer
很好的补充。 - 还有其他类似的中间件可用于组合/sorting您的复杂动作:一个非常stream行的是
redux-saga
,它与redux-thunk
非常相似,但是基于生成器函数的语法。 再次,你可能会把它和redux-promise
一起使用。 - 这里有一篇很棒的文章,直接比较了各种asynchronous合成选项,包括thunk和redux-promise-middleware。 (TL; DR: “Redux Promise Middleware与其他一些选项相比,可以显着减less样板文件的数量” … “我认为我喜欢Saga来处理更复杂的应用程序 (阅读:”使用“) 和Redux Promise Middleware。 )
- 请注意,有一个重要的情况,你可能认为你需要派遣多个行动,但你真的不需要,而且你可以保持简单的事情。 那就是你只是想要多个减速器来响应你的asynchronous调用。 但是, 根本没有理由为什么多个reducer不能监视一个单一的动作types。 你只是想确保你的团队知道你在使用这个约定,所以他们不会认为只有一个reducer(有一个相关的名字)可以处理一个给定的动作。
充分的披露:我对Redux开发比较陌生,自己也在为这个问题而苦苦挣扎。 我将解释我发现的最简洁的答案:
ReduxPromise在分派操作时返回承诺作为有效负载,然后ReduxPromise中间件工作来解决该承诺并将结果传递给reducer。
另一方面,ReduxThunk强制动作创build者在实际调度动作对象到调用者之前不再拖延,直到调用调用。
这里有一个链接到我find这个信息的教程: https : //blog.tighten.co/react-101-part-4-firebase 。
- React js中的“挂载”是什么?
- 未被捕获的错误:不变的违规:元素types是无效的:期望一个string(对于内置组件)或一个类/函数,但得到:对象
- 什么是AMP HTML,它如何适应框架/工具X?
- 为什么ref ='string'是“legacy”?
- Reactjs – 重新调整浏览器大小
- 客户端路由(使用react-router)和服务器端路由
- React-Redux:所有组件状态应该保存在Redux Store中
- ReSt.js中的setState和replaceState
- Webpack / Babel / React生成错误:“未知选项:foo / node_modules / react / react.js.Children”