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

Angular2 - GET 400 disabling my observable.subscribe with interval

我有一个应用程序,其中有功能 get(),它通过 http GET 返回我 Observable.interval(1000)

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

一切正常,直到得到响应 returns 400 - 服务器不时发送 404 - 正常。但是当我收到 400 时,我的订阅停止工作。 屏幕仅显示最后一个值并停止 "refreshing"

这是一些代码:

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")
  );

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

所以程序 运行 很好 - 29 成功了,但是当它收到 400 时它停止了,那里没有更多 "ok"。

问题出在哪里?我的 getAct() 是错误的,还是我订阅的时候编码出了问题?

请帮忙,我试图修复这个,但我不能。

我可以做这样的东西,但我认为这是一个非常糟糕的解决方案。

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

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

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

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

这是一种激进的策略,因为一旦 请求失败,它将re-subscribe 到原始可观察对象(this.http.get(...)。您最终可能会严重打击服务器。

您可能想改用 retryWhen(),这会让您在重试之前引入轻微的延迟,例如:

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