【问题标题】:GET Request every interval time, with errors handlingGET请求每间隔时间,错误处理
【发布时间】:2017-11-07 13:42:41
【问题描述】:

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

我有一项服务正在执行一些 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

【问题讨论】:

    标签: angular rxjs observable angular2-services


    【解决方案1】:

    可能是因为

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

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

    【讨论】:

      【解决方案2】:

      首先,您需要改变思考问题的方式,并开始更多地进行功能性和反应性的思考。 这说起来容易做起来难,但是通过实践,这将成为第二天性,并且可能会使您的许多代码更容易理解。

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

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

      2. 目前,您正在为每个 api 调用订阅一个 observable。要链接所有 api 调用并并行调用它们,我们可以使用“forkJoin”。请注意,有很多像“forkJoin”这样的操作符,要知道所有这些操作符是很费劲的。我需要谷歌“rxjs observables parallel”才能知道“forkJoin”是我们需要的。

      3. 如果我们需要将来自 observable 的数据结构转换为另一个数据结构,我们需要使用“map”操作符

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

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

      6. 您始终可以在任何操作员中使用 console.log 来了解到达的数据 例如:forkJoin(...obsSources).map(x=> { console.log(x) })

      7. 如果您被卡住并且找不到解决问题的运算符,您可以订阅 observable 并使用 subscribe 函数调用其他函数,该函数从 subscribe 函数发出的内容中获取其参数(而不是创建一个新数组或对象) 例如:forkJoin(...obsSources).subcribe(x=> { func1(x) })

      我没有测试代码就解决了这个问题,所以它可能不适用于你的特殊情况,但我想分享一下事情是如何与 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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多