如何在出错时恢复RxJs Observable Interval

时间:2017-07-03 16:02:40

标签: rxjs observable

我正在合并两个Observable。 第一个获取init的当前温度。 第二个以一定的间隔轮询API。 如果Api调用失败,则不会恢复Observable间隔。

我怎么能恢复它?

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?
      });
  }

有什么想法吗? TY

2 个答案:

答案 0 :(得分:0)

使用http状态代码,只有当200个让我们说:

时才可以检索一个observable

&#13;
&#13;
 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?
      });
  }
&#13;
&#13;
&#13;

重要的是这个返回Observable.onErrorResumeNext();

答案 1 :(得分:0)

使用catch

  

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调用,因为它不会为空的observable发出。

当然,您可能会遇到错误的替代行为,但您需要抓住它以避免遇到问题。