在我的应用程序中,我创建了一个删除用户的操作,但是在删除此用户之前,屏幕上会提示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]重新验证成功(密码有效);
继续...
答案 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