“authenticationService”提供以下身份验证方法。我无法输入管道catchError。我错过了什么?
authenticate(credentials: { username: string; password: string }){
return new Observable<any>((observer: Observer<any>) => {
// ... calling the service, obtaining a promise
const authenticationPromise = ... ;
// This is a promise, it must be converted to an Observable
authenticationPromise
.then(() => {
observer.next('ok');
observer.complete();
})
.catch(err => {
console.log('service error ' + err);
throw new Error('crap');
});
});
}
设置所有ngrx&amp;除了ngrx /效果部分,根据用户请求调用此身份验证方法:
(redux stuff).(({ payload }: actions.LoginRequestAction) =>
context.authService.authenticate(payload)
.pipe(
map(() => new GenericSuccessAction(...))
// Even though a throw statement happened in the authenticate method, this is never reached:
catchError((err: Error) => {
console.log('[debug] error caught: ', err);
return of(new actions.LoginFailureAction());
}),
)
)
答案 0 :(得分:1)
如上所述here,catchError用于:
优雅地处理可观察序列中的错误。
首先,您基本上是通过捕获承诺中的错误来处理您的承诺中的错误。抛出promise中的错误并不会返回发出错误的observable。
你可以:
.catch
。throwError(err)
无论哪种方式,你创建observable的方式都值得怀疑。
这是处理rxjs中承诺的更好,更简洁的方法:
from(authenticationPromise)
.pipe(
map(() => 'ok')
)