ngrx效果调度会导致内存泄漏吗?

问题描述 投票:0回答:1

所以我正在学习 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(默认值)时,我认为出现了内存泄漏。

angular typescript ngrx
1个回答
0
投票

效果用于处理应用程序的副作用,例如发出后端请求。

典型的效果监听一个动作,处理副作用,并根据副作用的结果调度一个新的动作。 例如,它将分派包含后端请求结果的操作或带有错误的错误操作。

如果您不将操作映射到新操作(如示例中所示),则该效果将不断被重新调用,因为它收到相同的操作。在某些情况下,这可能是所需的行为,例如轮询数据。

如果您不希望出现此行为,请将传入操作映射到不同的操作,或使用

dispatch: false
配置禁用在效果结束时调度该操作。

© www.soinside.com 2019 - 2024. All rights reserved.