[英]Timer stops whenever an error occurred in the subscription
我有一个在其构造函数中运行计时器的服务。 计时器调用异步 function 调用 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);
})
);
}
发生错误时关闭可观察对象。 因此,您可以使用 function 将其转换为next
通知of
而不是使用throwError
function 转发错误。 如果您担心它可能会混淆实际的响应处理机制,您可以使用 RxJS NEVER
常量来不从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
的情况下,您可以处理订阅内的通知。
如果任何内部可观察对象 [ this.getData()
,在这种情况下] 错误,switchMap 会发出错误。 相反,您可能希望捕获内部可观察对象本身的错误。
另请记住,RxJS 蒸汽会发出一个error
或一个complete
的发射。 永远不会,永远不会两者兼而有之。 如果错误到达您的 switchMap,那么您的 stream 的那部分就完成了。 相反,您可以使用重试从头开始重新创建 stream。
subscription : Subscription;
constructor(private httpClient : HttpClient){
this.subscription = timer(0, 10000).pipe(
switchMap(_ => this.getData().pipe(
catchError(err => /*Do something*/)
)
).subscribe();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.