代码之家  ›  专栏  ›  技术社区  ›  1ven

如何在redux observable中执行epic内部的副作用?

  •  10
  • 1ven  · 技术社区  · 7 年前

    redux-observable ,epics正在接受动作流并返回新的动作流。在我的用例中,我需要在调度一些操作后发送分析事件,然后什么也不做。

    redux-saga ,我可以用 takeEvery ,并在saga函数内部执行副作用:

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

    如果这两个库都是反模式的,那么对于这类效果应该使用什么解决方案?

    1 回复  |  直到 7 年前
        1
  •  22
  •   jayphelps    7 年前

    绝对不是一个完全反模式的“只读”史诗——但我想提醒的是,这通常是一个人在做一些不地道的事情的标志,但这不是其中之一。

    在Rx中,可能有许多方法可以实现这一点。这里有两个:

    do+忽略元素

    我认为这是最清楚的。 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 但是,在你和你的队友对RXJ有了扎实的掌握,尤其是在创建自定义/匿名观察对象之前,我会提醒大家不要使用这个。i、 不要写你不懂的代码。

    const someEpic = action$ =>
      new Observable(() =>
        action$.ofType('SOME_ACTION')
          .subscribe(() => sendAnalytics()) // subscription is returned so it can be cleaned up
      );
    

    如果有人有时间发布这个用例,它将是文档中食谱部分的一个很好的补充。


    顺便说一句,这主要是一个RxJS问题,其中流恰好是动作。如果你在RxJS而不是redux observable的上下文中搜索或表达你的问题,你可能会发现你得到了答案并得到更好的长期支持。几乎所有的redux可观察问题实际上都是RxJS问题,这是因为知识是可转移的!