只要订阅中出现错误,计时器就会停止



我有一个服务,它在构造函数中运行计时器。计时器调用异步函数,该函数调用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的情况下,您可以处理订阅中的通知。

最新更新