GET请求每个间隔时间,并处理错误

时间:2017-11-07 13:42:41

标签: angular rxjs observable angular2-services

我认为问题很简单,但我无法自行修复此代码。

我有一个服务正在做一些GET请求。 GET通常会返回200,但有时会返回410.

我想每隔一段时间发出一次请求,例如每秒一次。 问题是当我使用一个可观察的机制时,它首先失败" 410"然后它在无限远的控制台上返回410.

我的服务代码:

getStatistic(){
var headers = new Headers();
headers.append("Content-Type", "application/x-www-form-urlencoded");
var options = new RequestOptions({headers: headers});

return this.http.get('http://localhost:8080/resource',options)
  .retryWhen(errors => errors.delay(5000))
  .map(
  (response:Response) => {
    return response.json();
  }
)
  }



 handleError(error:any){
    if(error.status === 404){
      return Observable.of(false)
    }else if(error.status===410){
      return Observable.throw({code:error.status, msg:error._body})
    }else{
      return Observable.of(false)
    }
  }

和Observable:

var observable =  TimerObservable.create(5000, 1000)
  .takeWhile(() => true)
  .subscribe(() => {
    this.statisticService.getStatistic()
      .subscribe(
        (data) => {
          console.log("data",data)
        },
        (err) => {
          console.log("err",err)
        }
      );
  },error2 => console.log("error"));

回复是这样的: 200 200 200 200 410< - 此时所有响应都不是从请求到服务器,只是缓存 410 410 ...

2 个答案:

答案 0 :(得分:1)

可能是因为

  

默认情况下,410响应可缓存。

客户端缓存该响应,甚至不再尝试调用服务器。

答案 1 :(得分:0)

首先,您需要改变您对问题的看法,并开始更多地考虑功能性和反应性。 说起来容易做起来难,但通过练习,这将成为第二天性,可能会让你的代码更容易理解。

让我们逐一解决每一个问题。

  1. 减少新构建的数据结构(如数组和对象)的数量。而是将一个函数的输出作为另一个函数的输入。

  2. 目前,您正在订阅每个api调用的可观察对象。要链接所有api调用并并行调用它们,我们可以使用“forkJoin”。请注意,有很多运营商喜欢“forkJoin”,知道所有这些都是很费劲的。我需要谷歌“rxjs observables parallel”知道“forkJoin”是我们需要的。

  3. 如果我们需要将从observable到达的数据结构转换为另一个数据结构,我们需要使用“map”运算符

  4. 如果我们需要从observable到达的数据来满足某个谓词,我们需要使用“filter”运算符

  5. 如果我们需要在调用另一个observable之前从一个observable获取响应,我们将使用运算符“flatMap”

  6. 您可以随时在任何运营商内部使用console.log来了解到达的数据 例如:forkJoin(...obsSources).map(x=> { console.log(x) })

  7. 如果你遇到困难而无法找到解决问题的运算符,你可以订阅observable并使用subscribe函数调用其他函数,该函数从subscribe函数发出的内容中获取其参数(而不是创建新数组)或对象) 例如:forkJoin(...obsSources).subcribe(x=> { func1(x) })
  8. 我在没有测试代码的情况下解决了这个问题,所以可能它不适用于你的特殊情况,但我想分享实际上与rxjs observables一起工作的方式。

    import { forkJoin } from "rxjs/observable/forkJoin";
    const obsSources = distinctDataAssIDs
                      .map(dataASSID=>this.api.getDataAssociationByID(dataASSID))
    forkJoin(...obsSources)
    .map(arrResults => arrResults.map(arrResult=> 
    arrResult.body.entities.DATAASSOCIATIONS[0]))
    .filter(dataAss => dataAss.DATAOBJECTS !== undefined)
    .map(dataAss =>  Array.from(new Set(dataAss.DATAOBJECTS)))
    .flatMap(secondMethodResult => this.service.thirdMethod(secondMethodResult))