Rxjs 无限循环清晰动作史诗

Rxjs 无限循环清晰动作史诗,rxjs,redux-observable,Rxjs,Redux Observable,我使用redux observable来处理redux异步操作 我需要通过id清除模块状态 这是我的ClearModuleByDepic: const clearModuleByIdEpic = (action$: ActionsObservable<any>) => { return action$.ofType(t.CLEAR_MODULE_BY_ID) .map((action: IActionPayload<any>): string =>

我使用
redux observable
来处理redux异步操作

我需要通过id清除模块状态

这是我的
ClearModuleByDepic

const clearModuleByIdEpic = (action$: ActionsObservable<any>) => {
  return action$.ofType(t.CLEAR_MODULE_BY_ID)
    .map((action: IActionPayload<any>): string => action.payload.id)
    .map(clearModuleById);
}
但当我单击delete按钮时,触发
onClear
click事件

它触发
clearModuleById
操作的无限循环

 private onClear(id: string) {
    this.props.clearModuleById(id);
  }

我犯了错误吗?

看起来你在史诗中发送的动作与你在史诗中过滤的动作相同。这将始终*导致无限循环。您需要始终A)调度不同的操作,或B)在触发相应的副作用后不调度epic中的任何其他操作

它看起来也不像你的史诗实际上在做什么,只是同步地重新调度相同的动作。redux observable中的Epics允许您为一个动作执行1个或多个(a)同步副作用

一般来说,你不应该从史诗中重新分派相同的动作,除非你是用某种形式的逃生舱。这是一种有效的递归形式,所有常见的递归问题都适用。未能突破递归意味着无限循环


*当然也有例外,但这在99.99%的情况下都是正确的。

看起来您从史诗中发送的动作与您在史诗中筛选的动作相同。这将始终*导致无限循环。您需要始终A)调度不同的操作,或B)在触发相应的副作用后不调度epic中的任何其他操作

它看起来也不像你的史诗实际上在做什么,只是同步地重新调度相同的动作。redux observable中的Epics允许您为一个动作执行1个或多个(a)同步副作用

一般来说,你不应该从史诗中重新分派相同的动作,除非你是用某种形式的逃生舱。这是一种有效的递归形式,所有常见的递归问题都适用。未能突破递归意味着无限循环


*也有例外,但99.99%的情况都是如此。

还想补充一点,这可能是因为对redux observable的工作原理有一点误解——您的epics在到达减速器后收到动作,因此如上所述,无需重新调度传入动作。从概念上讲,我喜欢把你们的史诗想象成是在重复一遍。他们无法吞咽或以其他方式阻止正常的redux事件发生,他们只能监听动作,并在某个时刻选择发出其他动作,通常是在执行副作用之后。还想补充一点,这可能是由于对redux observable的工作原理有一点误解——您的史诗在到达减速器后收到动作,因此如上所述,无需重新分派传入动作。从概念上讲,我喜欢把你们的史诗想象成是在重复一遍。他们无法吞咽或以其他方式阻止正常的redux事件发生,他们只能在执行副作用后,在某个时刻倾听动作并选择发出其他动作。