创建一个 meta-epic ,它像 combineEpics 一样工作,但根据命名空间选择一个史诗

Creating a meta-epic which works like combineEpics but selects one epic based on namespace

我正在尝试 命名空间 我的 epics。我基本上想结合我的 epics,但使用的史诗应取决于我的状态中设置的名称空间。 到目前为止我已经到达这里:

const epics = {
  'ns1': nameSpace1Epic,
  'ns2': nameSpace2Epic,
  'default': (action$, store) => {
    return Observable.of({type: 'NOP'})
  }
}
const superEpic = (action$, store) => {
  const { namespace } = store.getState()
  const epic = epics[namespace]
  const resultAction$ = epic(action$, store)
  return resultAction$
}

这适用于第一个操作,它成功切换到正确的命名空间。 然而,当第二个动作进来时,它仍然停留在第一个选择的命名空间。 没有动作经过超史诗,直接进入第一史诗。

我一直在阅读 Rx-documentation 并尝试使用不同类型的运算符,但没有任何运气。 有人知道我可能做错了什么吗?

我找到了解决问题的办法。 superEpic 应该是一个将操作(一次一个)定向到命名空间流的流,它现在所做的只是用另一个流替换自己。 flatMap 救援:

const superEpic = (action$, store) => 
  action$.flatMap(action => {
    const { namespace } = store.getState()
    const epic = epics[namespace]
    return epic(Observable.of(action), store)
  })

如果您想在操作流中使用 ofType 运算符,请确保从 redux-observable/lib/ActionsObservable 导入 ActionsObservable 像这样:

import { ActionsObservable } from 'redux-observable/lib/ActionsObservable'