执行错误后,Ngrx操作未完成

时间:2018-08-29 13:19:27

标签: angular typescript redux ngrx

错误发生后动作无法正确完成

在我的应用程序中,我创建了一个删除用户的操作,但是在删除此用户之前,屏幕上会提示Dialog,要求告知管理员密码,如果管理员密码正确,则会删除该用户。

我的问题是,当管理员密码不正确时,我打了个电话说输入的密码无效,此后我无法通过输入有效密码来完成操作。

股票序列:

  

[用户]删除用户;

     

[Auth]重新认证用户;

     

[Auth]重新验证错误(密码无效);

     

[Auth]重新验证用户

     

[Auth]重新验证用户

     

[Auth]重新验证用户

     

没有成功也没有错误

问题:在这种情况下,当我尝试使用有效密码再次调用重新认证操作时,仅调用Reauthenticate函数,但未检测到该操作成功完成。

我在一些有关使用Ngrx的源信息中看到,以某种方式创建@Effect来侦听该操作的调用,在调用发生并且此操作发生错误之后不能再被调用返回成功。

这是真的吗?

usuarios.effects.ts:

@Effect()
deleteUser$: Observable<Action> = this._action$.ofType(userActions.DELETE)
    .map((action: userActions.Delete) => action)
    .switchMap(data => {
        return this._userService.deleteUser(data.payload);
    })
    .map(() => new userActions.DeleteSuccess())
    .catch((err) => {
        return Observable.of(new userActions.DeleteError({error: err}));
    });

usuarios.service.ts:

deleteUser(user: IUser): Observable<void> {

    const reautenticateUser = this._modalService.create({
        nzTitle: 'Delete user',
        nzContent: ReauthenticateUserComponent,
        nzFooter: [{
            type: 'danger',
            label: 'Cancel',
            onClick: (componentInstance) => {
                componentInstance.closeDialog();
            }
        },
        {
            type: 'primary',
            label: 'Ok',
            onClick: (componentInstance) => {
                componentInstance.reauthenticateUser();
            },
            disabled: (componentInstance) => {
                return componentInstance.adminPassword.invalid;
            },
        }
        ]
    });

    return reautenticateUser.afterClose
        .switchMap((authenticated: boolean) => {

            if (authenticated) {
                const ref = this._angularFirestore
                    .doc<IProfissional | IRecepcionista>(`users/${usuario.id}`);

                return Observable.fromPromise(ref.delete()).map(() => {
                    this._message.info('User deleted success', {
                        nzDuration: 5000,
                        nzPauseOnHover: true,
                        nzAnimate: true
                    });
                });
            }

            throw new Error('Password invalid');
        });
}

注意::删除用户的操作成功完成后,我可以再次执行该操作,没有任何问题。

按以下顺序运行,我没有问题:

  

[用户]删除用户;

     

[Auth]重新认证用户;

     

[Auth]重新验证成功(密码有效);

     

[用户]删除用户成功;

     

[用户]删除用户;

     

[Auth]重新认证用户;

     

[Auth]重新验证成功(密码有效);

     

继续...

2 个答案:

答案 0 :(得分:2)

这是因为Observable在捕获错误时完成。您必须在内部捕获错误,以便外部Observable继续发出:

.mergeMap(data =>
    this._userService.deleteUser(data.payload)
    .map(() => new userActions.DeleteSuccess())
    .catch((err) =>
        Observable.of(new userActions.DeleteError({error: err}))
    )        
)

我已切换到mergeMap,您可能不想用另一个删除操作来取消删除操作。另外,如果您想使用RxJS 6:

mergeMap(data =>
    this._userService.deleteUser(data.payload).pipe(
        map(() => new userActions.DeleteSuccess()),
        catchError((err) =>
          of(new userActions.DeleteError({error: err}))
        }),
    )
)

答案 1 :(得分:0)

当我返回>>> shapiro( dr.data.get_data_yahoo( 'SPY', start = '2010-01-01', end = '2015-01-01' )['Close'].pct_change()[1:] ) (0.943816065788269, 1.9090532861060437e-21) >>> shapiro( dr.data.get_data_yahoo( 'QQQ', start = '2010-01-01', end = '2015-01-01' )['Close'].pct_change()[1:] ) (0.9631340503692627, 2.548133516564297e-17) >>> shapiro( dr.data.get_data_yahoo( 'AAPL', start = '2010-01-01', end = '2015-01-01' )['Close'].pct_change()[1:] ) (0.9560988545417786, 5.674560331738808e-19) >>> shapiro( dr.data.get_data_yahoo( 'AMZN', start = '2010-01-01', end = '2015-01-01' )['Close'].pct_change()[1:] ) (0.9394155740737915, 3.106424182886848e-22) 时,我收到以下消息,此后没有其他作用:

err

我能够通过返回ERROR Error: Detected unserializable action at "error"而不是err.message来解决。

err