在redux-observable
中,史诗正在接受动作流并返回新的动作流。在我的用例中,我需要在调度某个操作后发送分析事件,并且在之后不执行任何操作。
使用redux-saga
,我可以使用takeEvery
监听该操作,并在传奇功能中执行副作用:
function* saga() {
yield takeEvery('SOME_ACTION', function*() {
sendAnalytics();
})
}
但我怎样才能与redux-observable
达到同样的效果呢?有很多副作用,不需要调度新动作,比如初始化插件,记录,设置cookie等......
如果它是这两个库的反模式,那么应该使用什么解决方案来解决这些问题呢?
答案 0 :(得分:18)
绝对不是一个完全没有“只读”史诗的反模式 - 但我要提醒一点,这通常表明一个人做的事情不是惯用的,但这不是那些案件。
在Rx中可能有很多方法可以实现这一点。这是两个:
我认为这是最清楚的。 do
仅用于执行下一个/错误/完成的副作用(通常是日志记录),而不会影响流。然后我们使用ignoreElements
来防止再次调度SOME_ACTION
(这将导致无限递归)。 See the rxjs docs for more info on these operators
const someEpic = action$ =>
action$.ofType('SOME_ACTION')
.do(() => sendAnalytics())
.ignoreElements();
这是一个更“轻量级”的解决方案,因为它不使用ofType
以外的任何运算符。我会告诫不要使用这个,直到你和你的队友掌握RxJS,特别是创建自定义/匿名的Observables。即不要编写你不理解的代码。
const someEpic = action$ =>
new Observable(() =>
action$.ofType('SOME_ACTION')
.subscribe(() => sendAnalytics()) // subscription is returned so it can be cleaned up
);
如果有人有时间公关,这个用例对文档的Recipes部分来说是一个很好的补充。
顺便说一下,这主要是一个RxJS问题,其中流恰好是动作。如果您在RxJS而不是redux-observable的上下文中搜索或表达您的问题,您可能会发现您可以获得答案并获得更好的长期支持。几乎所有的redux-observable问题实际上都是RxJS问题,这很好,因为知识可以转移!