如何在错误时恢复RxJs可观察间隔

如何在错误时恢复RxJs可观察间隔

问题描述:

我正在合并两个可观察对象。 第一个获得init的当前温度。 第二个API以一定的时间间隔轮询API。 如果Api调用失败,则不会恢复Observable时间间隔。如何在错误时恢复RxJs可观察间隔

我该如何恢复?

getCurrentTemp(): Observable<number> { 
    return this.http.get(this.environmentService.getTemperatureUrl()) 
     .map((res: Response) => res.json()) 
     .switchMap(() => res.temp); 
    } 

    pollCurrentTemperature(): Subscription { 
    const temp$ = this.getCurrentTemp(); 
    const tempInterval$ = Observable 
     .interval(3000) 
     .flatMap(() => this.getCurrentTemp()); 

    return temp$ 
     .take(1) 
     .merge(tempInterval$) 
     .subscribe((temp: number) => { 
     console.log('temp', temp); 
     }, (err) => { 
     console.log('error', err); 
     // When the api fails my interval does not resume. How can I retry it? 
     }); 
    } 

任何想法?泰

+0

也许这可能有所帮助:https://*.com/a/34999441/2829204 – CozyAzure

+0

你想要间隔从最后一个没有失败的'索引'继续? – martin

使用HTTP状态代码,你可以检索可观察到的只有当它的200让我们说:

getCurrentTemp(): Observable<number> { 
 
    return Observable.from(
 
     [ 
 
     { value: 1, status: 200 }, 
 
     { value: 2, status: 200 }, 
 
     { value: 3, status: 200 }, 
 
     { value: 4, status: 200 }, 
 
     { value: 5, status: 200 }, 
 
     { value: 6, status: 400 }]) 
 
     .switchMap((x: any) => { 
 
     if (x.status === 200) { 
 
      return Observable.of(x.value); 
 
     } 
 
     return Observable.onErrorResumeNext(); 
 
     }); 
 
    } 
 

 
    pollCurrentTemperature(): Subscription { 
 
    const temp$ = this.getCurrentTemp(); 
 
    const tempInterval$ = Observable 
 
     .interval(3000) 
 
     .flatMap(() => this.getCurrentTemp()); 
 

 
    return temp$ 
 
     .take(1) 
 
     .merge(tempInterval$) 
 
     .subscribe((temp: number) => { 
 
     console.log('temp', temp); 
 
     }, (err) => { 
 
     console.log('error', err); 
 
     // When the api fails my interval does not resume. How can I retry it? 
 
     }); 
 
    }

最重要的一点是这个回报Observable.onErrorResumeNext();

使用catch

美中不足的是:从onError的通知,通过持续的序列无误

getCurrentTemp(): Observable<number> { 
    return this.http.get(this.environmentService.getTemperatureUrl()) 
     .map((res: Response) => res.json()) 
     .catch(error => { 
      console.log('Error occured'); 
      return Observable.empty(); 
     }); 
     .switchMap(() => res.temp); 
} 

恢复将捕获错误并默默地在其位置返回empty观察到。实际上,switchmap会无声地跳过失败的api调用,因为它不会发出空的可观察对象。

当然,你可能会有一个错误的替代行为,但你需要赶上它,以避免你面临的问题。