清晰动作史诗的无限循环
Infinite loop for clear action epic
我使用 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
操作的无限循环。
我是不是犯了什么错误?
看起来您正在从史诗中调度与您在该史诗中过滤的相同的动作。这将始终*导致无限循环。您需要始终要么 A) 调度不同的操作,要么 B) 在触发适当的副作用后不调度史诗中的任何其他内容。
看起来您的史诗实际上并没有在同步执行 re-dispatching 相同的操作。 redux-observable 中的 Epics 允许您对一个动作执行 1 个或多个 (a) 同步副作用。
一般来说,您不应该 re-dispatch 史诗中的相同动作,除非您使用某种形式的逃生舱口这样做。这实际上是一种递归形式,适用于所有常见的递归问题。无法跳出递归意味着死循环
*也有例外,但 99.99% 的情况都是如此。
我使用 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
操作的无限循环。
我是不是犯了什么错误?
看起来您正在从史诗中调度与您在该史诗中过滤的相同的动作。这将始终*导致无限循环。您需要始终要么 A) 调度不同的操作,要么 B) 在触发适当的副作用后不调度史诗中的任何其他内容。
看起来您的史诗实际上并没有在同步执行 re-dispatching 相同的操作。 redux-observable 中的 Epics 允许您对一个动作执行 1 个或多个 (a) 同步副作用。
一般来说,您不应该 re-dispatch 史诗中的相同动作,除非您使用某种形式的逃生舱口这样做。这实际上是一种递归形式,适用于所有常见的递归问题。无法跳出递归意味着死循环
*也有例外,但 99.99% 的情况都是如此。