如何在计时器中继续 catchError (rxjs)

How to continue catchError in timer (rxjs)

我有一项服务负责使用计时器每 x 秒执行一次 httpClient.get。 我需要这个计时器在服务启动时启动 运行,因此 timerservice 中定义构造函数。根据我的理解,订阅应该注册在定时器范围内,如下所示(如果不需要,我不想更改它,除非它不正确)。

只要后端服务器没有 errors\exceptions\error 500 异常,所有系统都可以正常工作。 现在,我需要两件事:

  1. 我想在后端服务器出现问题时catchError
  2. 我希望观察者根据计时器时间(到下一个滴答)保持 运行,即使有异常。 我的最终结果应该是在出现异常时到达组件中的 popUpAlert 查看我的代码 - 这是 webapi 控制器:
public IActionResult getSomeErrorAsTest()
{
    try
    {
        throw new Exception("Serer error");
    }
    catch(Exception ex)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, new List<string>());
        //throw ex;
    }
}

这是服务(假设每次get请求中的数据都发生变化-如果确实发生则无需实现):

export class MyService
{
    MyDataSubject = new Subject<any[]>();
    MyDataChanged :Observable>any[]> = this.MyDataSubject.asObservable();
    
    subscribe :Subscription;
    constructor(private httpClient : HttpClient)
    {
        this.subscribe = timer(0, 30000).pipe(
        switchMap(()=>
            this.getData())).subscribe();
    }
    getData()
    {
        return this.httpClient.get<any[]>(<controller url>)
        .pipe(
            tap(res =>
            {
                this.MyDataSubject.next(res);
            }),
            catchError(error =>
                {
                    debugger;//I would expect to catch the debugger here, but nothing happens
                    return throwError(error);
                })
            )
    }
}   

消费者组件:

export class MyComponent (private mySrv : MyService)
{
    getMyData()
    {
        let sub =this.mySrv.MyDataChanged.subscribe(result => doSomething(),
                                                    error=> popUpAlert());
    }
}

CatchError operator allows to handle error, but doesn't change nature of observable - error is terminal condition to given observable so emission will stop. CatchError allows to emit desires value when it occurs instead of raising observer's error callback (metasong).

您可能希望在内部 Observable 中处理错误(即在 switchMap 中),因此在那里抛出的错误不会冒泡到主流,这样在错误发生后主流会继续,如图所示以下:

  this.subscribe = timer(0, 30000)
    .pipe(
      switchMap(() => this.getData().pipe(catchError(x => of("handle error here"))))
      // catchError(...) don't handle error here
    )
    .subscribe();