繁体   English   中英

只要订阅中发生错误,计时器就会停止

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM