为什么要在中间件内部处理 Observables——而不是调度组合 Observables 的输出?

Why handle Observables inside of middleware - vs dispatching the output of combined Observables?

当我看到所有这些鼓励您分派一个异步发出其他动作的动作的中间件时,我觉得我正在服用疯狂的药丸。我认为异步可以(也许应该?)在存储之前完成。

对我来说,Rx 的好处是您可以获取传入的动作流,将其中一些映射到其他动作的可观察对象,然后将整个结果平面映射以获得有序的事件序列。然后,您可以通过将每个事件分派给它来将该结果流链接到商店中。

不仅将 async 放入操作中会采用 Redux 的简单模型并使其复杂化,而且这意味着当您进行时间旅行调试时 - 您可能会触发新的 AJAX 请求(这可以擦洗时重写您的历史记录?)。

我想我觉得将 RxJS 的强大功能放在 store 前面对我来说很有意义,但我很困惑为什么要将它放在一个库中 旁边的商店是有道理的。我同意 Observables 是 Epics 的一个很好的模型,但我想知道是否让 Redux 关心它永远不应该知道的事情。

背景:看过这个视频https://www.youtube.com/watch?v=AslncyG8whg,学了几年Rx,学了半年Redux。

Store enhancer 相互环绕。使用 Redux 的 compose 函数,传递给 compose 的增强器从右到左排序。因此,如果我使用 const storeEnhancer = compose(applyMiddleware(...middlewares), DevTools.instrument()),DevTools 增强器将环绕真实存储,而中间件增强器将环绕 DevTools 增强器。

这意味着时间旅行调试将只使用已经通过所有中间件的动作,重放这些动作不会再次通过中间件链。换句话说,只会重播实际影响商店的操作。

另一件需要考虑的事情是像中间件这样的东西允许访问商店的 API 以进行调度和检查状态,并且 可以 被认为是 "inside" 商店,但最终的关键是它们在 "real" 商店本身之上的一层中处理。

您可能想阅读 Dan 关于中间件和异步行为的精彩文章: and , which help clarify the reason for middleware, as well as the other links and explanations at http://redux.js.org/docs/FAQ.html#actions-side-effects .