2017-07-20 37 views
0

我使用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操作触发无限循环。

我是否犯错误?

回答

2

看起来你正在从史诗中筛选出的史诗中分派相同的动作。这将始终*导致无限循环。您需要始终A)派遣不同的动作,或B)在触发适当的副作用后,不派遣史诗中的其他任何东西。

它看起来并不像你的史诗般实际上在做任何事情,只是同步重新调度同一动作。可重复观察的史诗将允许您为某个动作执行一个或多个(a)同步副作用。

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

*有例外,但这是真实的99.99%的时间。

+0

另外还想补充一点,这可能是由于对可重复观察的工作方式的轻微误解 - 你的史诗片段在他们已经达到减速器之后接收到动作*所以没有必要重新发送传入动作。从概念上讲,我喜欢将你的史诗般的思维想象成一面奔跑。他们不能吞下或以其他方式阻止正常的重复发生,他们只能听取行动,并且可能会决定在某些时候发出其他行为,通常在执行副作用后。 – jayphelps