所以我正在学习 NgRx,有些东西我需要牢记在心。当我创建一个效果并调度一个操作时,
createEffect
函数将运行。现在,据我所知,在 createEffect
配置中,有一个 dispatch
配置采用布尔值。我引用了 NgRx 文档中的调度配置:
确定effect发出的action是否被调度到store。如果为false,effect不需要返回类型
Observable<Action>.
假设调度设置为true(默认)。这意味着它会发出一个动作,并且由于发出了一个动作,因此将调用
createEffect()
,从而导致发出另一个动作。再次,调度为真,同样的无限递归循环将再次重复。
我的可重现示例:
示例动作:
export const incrementByN = createAction('[Counter Component] Increment With N', props<{value: number}>())
减速器示例:
export let counterReducer = (state = initialState, action: CounterActions | Action): number => {
if (action.type === '[Counter Component] Increment') {
return state + (action as CounterActions).value
}
return state
}
效果示例:
@Injectable()
export class CoutnerEffect {
saveCount = createEffect(() => {
return this.actions$.pipe(
ofType(incrementByN, decrement),
tap(action => {
console.log(action)
})
)
})
constructor(private actions$: Actions) {}
}
请记住,当我将调度设置为 true(默认值)时,我认为出现了内存泄漏。
效果用于处理应用程序的副作用,例如发出后端请求。
典型的效果监听一个动作,处理副作用,并根据副作用的结果调度一个新的动作。 例如,它将分派包含后端请求结果的操作或带有错误的错误操作。
如果您不将操作映射到新操作(如示例中所示),则该效果将不断被重新调用,因为它收到相同的操作。在某些情况下,这可能是所需的行为,例如轮询数据。
如果您不希望出现此行为,请将传入操作映射到不同的操作,或使用
dispatch: false
配置禁用在效果结束时调度该操作。