Angular2 - GET 400禁用我的observable.subscribe,间隔为

时间:2017-02-13 16:06:17

标签: angular typescript angular2-services

我有应用程序,其中我有函数get(),它使用http GET返回Observable.interval(1000)

在app.component中我订阅了这个Observable并在屏幕上打印了一些来自GET的值。

Everythings工作正常,直到get响应返回400 - 服务器不时地发送404-正常。但当我收到400时,我的订阅停止工作。 屏幕仅显示最后一个值并停止“刷新”

以下是一些代码:

getAct(symbol:string): Observable<Act> {

return Observable
  .interval(1000)
  .flatMap(() => {
    return this.http.get(url)
      .map((res: Response):Act => (res.json()))
      .catch(err =>  {
        return Observable.throw(err); 
      });
  });

}

以下是订阅的代码:

this.actSub = this.actService
  .getAct(this.symbol)
  .subscribe(
    act => {
        console.log("ok");
        this.act = act;            
      }
    },
    err => {console.warn(err);},
    ()=>console.log("Done")
  );

所以,如果我在控制台中运行我的应用程序我有这个: enter image description here

所以程序运行良好 - 29取得成功,但当它恢复400停止时,那里没有“ok”。

问题出在哪里?我的getAct()是错误的,或者当我订阅时我编写了不好的代码?

请帮助,我试着修复它,但我不能。

2 个答案:

答案 0 :(得分:1)

我可以做这样的事情,但我认为这是非常糟糕的解决方案。

  get(){
        this.actSub = this.actService
          .getAct(this.symbol)
          .subscribe(
            act => {
                console.log("ok");
                this.act = act;            
              }
            },
            err => {
                console.warn(err);
                this.get();
            },
            ()=>console.log("Done")
          );
    }

答案 1 :(得分:1)

有几个RxJS运算符可以处理错误。

最简单的方法是使用retry()

return this.http.get(url)
  .retry()
  .map(res => res.json());

这是一种激进的策略,因为只要请求失败,它就会重新订阅原始的observable(this.http.get(...)。你最终可能会非常努力地击中服务器。

您可能希望使用retryWhen()代替,这会让您在重试之前引入一点延迟,例如:

return this.http.get(url)
  .retryWhen(errors => errors.delay(2000))  // 2-second delay before retrying
  .map(res => res.json());