使用Ngrx触发效果时出现无限循环

时间:2019-04-28 22:37:06

标签: angular typescript angularfire2 ngrx-effects state-management

我对使用 Rxjs Ngrx 有点陌生,但是我遇到的问题是,每当发生身份验证错误时,alert()就会显示Firebase返回错误消息。

问题是,当发生错误时,我只想显示一条错误消息……它陷入无限循环,并且内存使用量增加,因此我被迫关闭应用程序。

当我正确输入电子邮件和密码时,应用程序将以正确的方式运行……只要返回Firebase错误,就会出现问题。

如果我没有为Effect()创建一个AUTH_ERROR ...,并且我在 Redux DevTools 中看到了应用程序状态错误,则不会发生无限循环。

@Effect()
    loginWithEmailPassword: Observable<Action> = this._actions.pipe(
        ofType(authActions.LOGIN_EMAIL_PASSWORD),
        map((action: authActions.LoginEmailPassword) => action.payload),
        switchMap(data => from(this._angularFireAuth.auth
            .signInWithEmailAndPassword(data.email, data.password)).pipe(
                switchMap(response => forkJoin([
                    from(response.user.getIdTokenResult(true)),
                    of(response.user)
                ])),
                map(([token, user]) => {

                    if (user) {
                        this._router.navigate(['']);

                        return new authActions.Authenticated({
                            admin: token.claims.admin,
                            profissional: token.claims.profissional,
                            assinante: token.claims.assinante,
                            firestoreCollection: token.claims.firestoreCollection,
                            user: user
                        });
                    }
                }),
                catchError((error) => of(new authActions.AuthError({ error: error })))
            ))
    )

    @Effect()
    authError$: Observable<Action> = this._actions.pipe(
        ofType(authActions.AUTH_ERROR),
        tap(action => alert(action.payload.error.message))
    )

1 个答案:

答案 0 :(得分:0)

为解决此问题,我将派发参数传递为false。

 @Effect({ dispatch: false })
    authError$: Observable<Action> = this._actions.pipe(
        ofType(authActions.AUTH_ERROR),
        tap(action => alert(action.payload.error.message))
    )