【问题标题】:NgRx Effects infinite loopNgRx 效果无限循环
【发布时间】:2019-08-27 16:32:43
【问题描述】:

我知道这个问题在 SO 上已经被问了一百万次了。但我需要帮助。我确实意识到我必须在这里遗漏一些重要的东西。但我没看到。

以下代码触发无限循环。 REMOVE_PROJECT 仅被调度一次。 REMOVE_PROJECT_SUCCESS 被无限触发。 'removed' 被无限记录。我不知道为什么。

所有动作都有独特的类型。 dispatch: false 已为 REMOVE_PROJECT_SUCCESS 启用。

操作:

export const REMOVE_PROJECT = createAction(
    '[Project] Remove Project',
    props<{ id: string }>()
);

export const REMOVE_PROJECT_SUCCESS = createAction(
    '[Project] Remove Project Success',
);

效果:

@Effect()
removeProject$ = createEffect(() => this.actions$.pipe(
    ofType(ProjectActions.REMOVE_PROJECT),
    switchMap(props =>
        this.projects.removeProject(props.id).pipe(
           map(() => ({ type: '[Project] Remove Project Success'}),
        // have also tried
        // map(() => ProjectActions.REMOVE_PROJECT_SUCCESS())
        )
    ))
))


@Effect({ dispatch: false })
removeProjectSuccess$ = createEffect(() => this.actions$.pipe(
    ofType(ProjectActions.REMOVE_PROJECT_SUCCESS),
    tap(() => console.log('removed')),
))

删除功能:

removeProject(projectId): Observable<void> {
    return from(this.db.doc('projects/' + projectId).ref.delete());
}

【问题讨论】:

    标签: angular observable ngrx ngrx-effects


    【解决方案1】:

    这是因为您将 @Effect() 装饰器与 createEffect() 一起使用。他们都在幕后做同样的事情,很可能触发了无限循环。删除@Effect() 注释(推荐)或createEffect()(我会留下这个)。

    更具体地说,createEffect() 还将{dispatch: false} 作为第二个参数(在您的可观察管道之后)。由于您没有在第二个选项中包含此选项,它只会重新调度您使用 ofType 过滤的操作,从而在您遇到的无限循环中一遍又一遍地触发相同的操作。

    如果你不想调度,第二个效果应该是这样的:

    removeProjectSuccess$ = createEffect(() => this.actions$.pipe(
        ofType(ProjectActions.REMOVE_PROJECT_SUCCESS),
        tap(() => console.log('removed')),
    ), { dispatch: false })
    

    在底层,装饰器和函数都向EffectsModule 使用的可注入类添加注释。在这种情况下,它会生成一个不会分派的效果,以及默认分派的第二个效果。我希望这是有道理的。

    【讨论】:

    • 不敢相信我没有注意到我正在结合不同版本的 NgRx 的实践。我觉得很愚蠢:-(谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2019-11-28
    • 2023-03-28
    • 2018-01-11
    • 2013-01-20
    相关资源
    最近更新 更多