如何在redux-observable中执行史诗中的副作用?

时间:2017-08-09 10:33:28

标签: javascript redux rxjs redux-saga redux-observable

redux-observable中,史诗正在接受动作流并返回新的动作流。在我的用例中,我需要在调度某个操作后发送分析事件,并且在之后不执行任何操作。

使用redux-saga,我可以使用takeEvery监听该操作,并在传奇功能中执行副作用:

function* saga() {
  yield takeEvery('SOME_ACTION', function*() {
    sendAnalytics();
  })
}

但我怎样才能与redux-observable达到同样的效果呢?有很多副作用,不需要调度新动作,比如初始化插件,记录,设置cookie等......

如果它是这两个库的反模式,那么应该使用什么解决方案来解决这些问题呢?

1 个答案:

答案 0 :(得分:18)

绝对不是一个完全没有“只读”史诗的反模式 - 但我要提醒一点,这通常表明一个人做的事情不是惯用的,但这不是那些案件。

在Rx中可能有很多方法可以实现这一点。这是两个:

do + ignoreElements

我认为这是最清楚的。 do仅用于执行下一个/错误/完成的副作用(通常是日志记录),而不会影响流。然后我们使用ignoreElements来防止再次调度SOME_ACTION(这将导致无限递归)。 See the rxjs docs for more info on these operators

const someEpic = action$ =>
  action$.ofType('SOME_ACTION')
    .do(() => sendAnalytics())
    .ignoreElements();

Anonymous Observable

这是一个更“轻量级”的解决方案,因为它不使用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问题,这很好,因为知识可以转移!