Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular2-获取400禁用我的observable.subscribe with interval_Angular_Typescript_Angular2 Services - Fatal编程技术网

Angular2-获取400禁用我的observable.subscribe with interval

Angular2-获取400禁用我的observable.subscribe with interval,angular,typescript,angular2-services,Angular,Typescript,Angular2 Services,我有一个应用程序,其中我有函数get(),它返回我Observable.interval(1000)和http get 在app.component中,我订阅了这个可观察对象,并在屏幕上打印了GET的一些值 在get响应返回400(服务器不时发送404)之前,一切正常。但当我收到400,我的订阅停止工作。 屏幕仅显示最后一个值并停止“刷新” 下面是一些代码: getAct(symbol:string): Observable<Act> { return Observable .

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

在app.component中,我订阅了这个可观察对象,并在屏幕上打印了GET的一些值

在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); 
      });
  });
因此,如果我在console中运行我的应用程序,我有:

因此,程序运行良好-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操作符可以处理错误

最简单的方法是使用:

返回此.http.get(url)
.重试()
.map(res=>res.json());
这是一种积极的策略,因为一旦请求失败,它将重新订阅原始的可观察内容(
This.http.get(…)
)。你最终可能会狠狠地打击服务器

您可能想改用,这会让您在重试前稍微延迟,例如:

返回此.http.get(url)
.retryWhen(errors=>errors.delay(2000))//重试前延迟2秒
.map(res=>res.json());

这是正常行为。可观察对象在完成或出错后停止发送值(如4**HTTP响应)。
  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")
          );
    }