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 。