【问题标题】:Infinite loop for clear action epic无限循环,清晰的动作史诗
【发布时间】:2017-07-20 23:13:41
【问题描述】:

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

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

这是我的clearModuleByIdEpic

const clearModuleByIdEpic = (action$: ActionsObservable<any>) => {
  return action$.ofType(t.CLEAR_MODULE_BY_ID)
    .map((action: IActionPayload<any>): string => action.payload.id)
    .map(clearModuleById);
}

这是我的组件方法:调用clearModuleById 操作。

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

但是当我点击删除按钮时触发onClear点击事件。

它会触发clearModuleById 操作的无限循环。

我是不是犯了错误?

【问题讨论】:

    标签: rxjs redux-observable


    【解决方案1】:

    看起来您正在从史诗中发送相同的动作,您在该史诗中过滤。这将始终*导致无限循环。您需要始终 A) 分派不同的操作,或 B) 在触发适当的副作用后不分派史诗中的任何其他内容。

    看起来你的史诗实际上并没有做任何事情,只是同步地重新调度相同的动作。 redux-observable 中的 Epics 允许您为一个动作执行 1 个或多个 (a) 同步副作用。

    一般来说,您不应该从史诗中重新调度相同的动作,除非您使用某种形式的逃生舱口这样做。这实际上是一种递归形式,所有常见的递归问题都适用。未能跳出递归意味着无限循环。

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

    【讨论】:

    • 还想补充一点,这可能是由于对 redux-observable 的工作原理有一点误解——你的史诗收到动作 之后 他们已经达到了减速器,如前所述无需重新调度传入的操作。从概念上讲,我喜欢将您的史诗视为与 redux 一起运行。它们不能吞咽或以其他方式阻止正常的 redux 发生,它们只能监听动作,并可选择在某个时间点发出其他动作,通常是在执行副作用之后。
    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 2017-11-14
    • 2019-02-14
    • 2018-07-20
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多