2017-07-03 69 views
0

我正在合併兩個可觀察對象。 第一個獲得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://stackoverflow.com/a/34999441/2829204 – CozyAzure

+0

你想要間隔從最後一個沒有失敗的'索引'繼續? – martin

回答

0

使用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();

0

使用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調用,因爲它不會發出空的可觀察對象。

當然,你可能會有一個錯誤的替代行爲,但你需要趕上它,以避免你面臨的問題。