我有一个服务,它在构造函数中运行计时器。计时器调用异步函数,该函数调用API并应返回Observable。一切正常时,它运行良好。我现在正试图在API关闭时实现错误处理。问题是,每当发生错误时,计时器就会停止执行。
查看我的代码:
subscription : Subscription;
constructor(private httpClient : HttpClient)
{
this.subscription = timer(0, 10000).pipe
(
switchMap(() => this.getData();
}).subscribe();
}
getData(): Observable<someModel>
{
return this.httpClient.get<someModel>(<url>)
.pipe(
tap(response =>
{
do something
}),
catchError(error =>
{
<doSomeErrorHandling>
return throwError(error);
})
);
}
switchMap如果它的任何内部可观察性[this.getData()
,在这种情况下]出错,就会发出错误。相反,您可能希望捕捉内部可观察器本身的错误。
还要记住,RxJS蒸汽发射一个error
或一个complete
发射。永远不会更多,永远不会两者兼而有之。如果一个错误到达了switchMap,那么流的这一部分就永远完成了。相反,您可以使用retry从头开始重新创建流。
subscription : Subscription;
constructor(private httpClient : HttpClient){
this.subscription = timer(0, 10000).pipe(
switchMap(_ => this.getData().pipe(
catchError(err => /*Do something*/)
)
).subscribe();
}
当出现错误时,可观察对象将关闭。因此,您可以使用of
函数将错误转换为next
通知,而不是使用throwError
函数转发错误。如果你担心它可能会混淆实际的响应处理机制,你可以使用RxJSNEVER
常量不从catchError
块发出任何东西。
尝试以下
import { of, NEVER } from 'rxjs';
getData(): Observable<someModel>{
return this.httpClient.get<someModel>(<url>).pipe(
tap(response => {
do something
}),
catchError(error => {
// <doSomeErrorHandling >
return of(error); // (or) return NEVER;
})
);
}
另外,尽量只使用tap
治疗副作用。在只有一个switchMap
的情况下,您可以处理订阅中的通知。