Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何在计时器(rxjs)中继续捕获错误_Angular_Timer_Rxjs_Rxjs Observables_Rxjs Pipe - Fatal编程技术网

Angular 如何在计时器(rxjs)中继续捕获错误

Angular 如何在计时器(rxjs)中继续捕获错误,angular,timer,rxjs,rxjs-observables,rxjs-pipe,Angular,Timer,Rxjs,Rxjs Observables,Rxjs Pipe,我有一个服务,负责使用计时器每x秒执行一次httpClient.get。 每当服务启动时,我需要这个计时器开始运行,因此计时器在服务构造函数中定义。根据我的理解,订阅应该在计时器范围内注册,如下所示(如果没有必要,我不想更改它,除非它不正确) 只要后端服务器没有错误\异常\错误500异常,所有系统都可以正常工作。 现在,我需要两件事: 每当后端服务器出现问题时,我都希望捕获错误 我希望观察者根据计时器时间(到下一个滴答声)继续运行,即使出现异常。 我的最终结果应该是在出现异常时到达组件中的pop

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

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

  • 每当后端服务器出现问题时,我都希望捕获错误
  • 我希望观察者根据计时器时间(到下一个滴答声)继续运行,即使出现异常。 我的最终结果应该是在出现异常时到达组件中的popUpAlert 请参阅我的代码-这是webapi控制器:
  • public IActionResult getSomeErrorAsTest()
    {
    尝试
    {
    抛出新异常(“Serer错误”);
    }
    捕获(例外情况除外)
    {
    返回状态码(StatusCodes.Status500InternalServerError,new List());
    //掷骰子;
    }
    }
    
    这就是服务(假设每个get请求中的数据都发生了更改—如果确实发生了更改,则无需实现):

    CatchError
    操作员允许处理错误,但不会改变可观测的性质-错误是给定可观测的终端条件,因此发射将停止
    CatchError
    允许在发生错误时发出期望值,而不是引发观察者的错误回调()。

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

    this.subscribe=计时器(0,30000)
    .烟斗(
    switchMap(()=>this.getData().pipe(catchError(x=>of(“handleerror here”)))
    //catchError(…)不在此处处理错误
    )
    .subscribe();
    
    我会将整个错误处理转移到服务中。在您的服务中调用
    catchError
    中的
    popUpAlert()
    ,并返回
    of(null)
    。当结果为
    null
    但没有错误时,让您的组件处理这种情况。请参见我的回答:1)
    MyDataSubject
    不知道抛出了任何错误。因为它是在另一个流中抛出的2)您无法捕获由
    throwError
    操作符抛出的错误。它不会导致错误,而是会发出一个值。与您的问题无关(Rafi的答案一针见血),但Angular中的服务支持一些与组件(包括OnInit和OnDestroy)相同的生命周期回调。您最好在init钩子中启动计时器,并在destory钩子中销毁订阅。谢谢您的详细回答。由于HTTP_拦截器,我没有到达catchError
    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());
        }
    }