订阅时Angular中对http的重复调用

时间:2018-05-02 15:45:19

标签: javascript angular http rxjs

我是角色新手并试图实施仪表板应用程序。仪表板包含50多个不同的图表,所以我决定捕获这些图表用户的一个API调用的所有数据,json文件如下

{
"site": "bje",
"date": "2018-03-09T00:00:00",
"charts": [
    {
        "code": "INDK-01",
        "dataset": [
            {
                "name": "Actual",
                "data": [
                    {
                        "label": "05 Jan 2018",
                        "value": 351,
                        "date": "2018-01-05T00:00:00"
                    },
                    {
                        "label": "12 Jan 2018",
                        "value": 373,
                        "date": "2018-01-12T00:00:00"
                    },
                    {
                        "label": "19 Jan 2018",
                        "value": 353,
                        "date": "2018-01-19T00:00:00"
                    },
                    {
                        "label": "26 Jan 2018",
                        "value": 379,
                        "date": "2018-01-26T00:00:00"
                    },
                    {
                        "label": "02 Feb 2018",
                        "value": 356,
                        "date": "2018-02-02T00:00:00"
                    },
                    {
                        "label": "09 Feb 2018",
                        "value": 371,
                        "date": "2018-02-09T00:00:00"
                    },
                    {
                        "label": "16 Feb 2018",
                        "value": 371,
                        "date": "2018-02-16T00:00:00"
                    },
                    {
                        "label": "23 Feb 2018",
                        "value": 368,
                        "date": "2018-02-23T00:00:00"
                    },
                    {
                        "label": "02 Mar 2018",
                        "value": 369,
                        "date": "2018-03-02T00:00:00"
                    },
                    {
                        "label": "09 Mar 2018",
                        "value": 371,
                        "date": "2018-03-09T00:00:00"
                    }
                ]
            },
            {
                "name": "Budget",
                "data": [
                    {
                        "label": "05 Jan 2018",
                        "value": 0,
                        "date": "2018-01-05T00:00:00"
                    },
                    {
                        "label": "12 Jan 2018",
                        "value": 0,
                        "date": "2018-01-12T00:00:00"
                    },
                    {
                        "label": "19 Jan 2018",
                        "value": 0,
                        "date": "2018-01-19T00:00:00"
                    },
                    {
                        "label": "26 Jan 2018",
                        "value": 0,
                        "date": "2018-01-26T00:00:00"
                    },
                    {
                        "label": "02 Feb 2018",
                        "value": 0,
                        "date": "2018-02-02T00:00:00"
                    },
                    {
                        "label": "09 Feb 2018",
                        "value": 0,
                        "date": "2018-02-09T00:00:00"
                    },
                    {
                        "label": "16 Feb 2018",
                        "value": 0,
                        "date": "2018-02-16T00:00:00"
                    },
                    {
                        "label": "23 Feb 2018",
                        "value": 0,
                        "date": "2018-02-23T00:00:00"
                    },
                    {
                        "label": "02 Mar 2018",
                        "value": 0,
                        "date": "2018-03-02T00:00:00"
                    },
                    {
                        "label": "09 Mar 2018",
                        "value": 331.02,
                        "date": "2018-03-09T00:00:00"
                    }
                ]
            },
            {
                "name": "Target",
                "data": [
                    {
                        "label": "05 Jan 2018",
                        "value": 0,
                        "date": "2018-01-05T00:00:00"
                    },
                    {
                        "label": "12 Jan 2018",
                        "value": 0,
                        "date": "2018-01-12T00:00:00"
                    },
                    {
                        "label": "19 Jan 2018",
                        "value": 0,
                        "date": "2018-01-19T00:00:00"
                    },
                    {
                        "label": "26 Jan 2018",
                        "value": 0,
                        "date": "2018-01-26T00:00:00"
                    },
                    {
                        "label": "02 Feb 2018",
                        "value": 0,
                        "date": "2018-02-02T00:00:00"
                    },
                    {
                        "label": "09 Feb 2018",
                        "value": 0,
                        "date": "2018-02-09T00:00:00"
                    },
                    {
                        "label": "16 Feb 2018",
                        "value": 0,
                        "date": "2018-02-16T00:00:00"
                    },
                    {
                        "label": "23 Feb 2018",
                        "value": 0,
                        "date": "2018-02-23T00:00:00"
                    },
                    {
                        "label": "02 Mar 2018",
                        "value": 0,
                        "date": "2018-03-02T00:00:00"
                    },
                    {
                        "label": "09 Mar 2018",
                        "value": 331.02,
                        "date": "2018-03-09T00:00:00"
                    }
                ]
            }
        ]
    },..............etc
] }

服务.ts文件包含一个返回数据的函数,如下所示:

getDashboardData(): Observable<ProcessedData>{

return this._http.get<ProcessedData>(this.baseUrl)
  .map(res => res);
  }

我还创建了一个可重用的组件,它接受图表代码的输入(例如&#34; INDK-01&#34;在上面的json样本中)和ngOnInit我有这个代码

ngOnInit() {    
this._service.getDashboardData(this.selectedSite, this.selectedDate)
  .subscribe(res => {          
      this.BudgetData = res.charts.find(x => x.code == this.chartId)
      .dataset.find(x => x.name == 'Budget')
      .data
      .sort();
       this.TargetData = res.charts.find(x => x.code == this.chartId)
      .dataset.find(x => x.name == 'Target')
      .data
      .sort();
.
.
.
});
仪表板主页组件中的

我添加了多个 每次加载仪表板页面时它会多次调用API的问题,有什么方法可以避免这种情况吗?例如,将数据存储在全局对象中,并从每个图表中过滤以获取正确的数据。

2 个答案:

答案 0 :(得分:0)

你需要首先shareReplay(1)你的observable之类的东西来缓存数据:

const sharedOb = this._service.getDashboardData(this.selectedSite, this.selectedDate).shareReplay(1)

sharedOb.subscribe(x=>{
// do your work here
})

现在您可以根据需要订阅sharedOb,只有一台服务器往返。

答案 1 :(得分:0)

您可以使用&#34; .share&#34;。

this._service.getDashboardData(this.selectedSite, this.selectedDate).subscribe(res => 
{
  this.BudgetData = res.charts.find(x => x.code == this.chartId)
  .dataset.find(x => x.name == 'Budget')
  .data
  .sort();
   this.TargetData = res.charts.find(x => x.code == this.chartId)
  .dataset.find(x => x.name == 'Target')
  .data
  .sort();
}).share();