Javascript 对变量求和完成后,将项推送到数组

Javascript 对变量求和完成后,将项推送到数组,javascript,angular,http,Javascript,Angular,Http,使用Angular,我创建了一个组件,该组件触发初始web请求以及循环中使用的两个其他组件。我正在循环这些项目以设置sitecont,这是在第一个循环的请求中声明的。我正在使用setTimeout()将总金额推送到一个数组中,但这可能不是最佳做法 constructor(public http: HttpClient, public chart: ChartDetails) { this.http.get(`https://siteurl.com/items?$filter=Hub

使用Angular,我创建了一个组件,该组件触发初始web请求以及循环中使用的两个其他组件。我正在循环这些项目以设置
sitecont
,这是在第一个循环的请求中声明的。我正在使用
setTimeout()
将总金额推送到一个数组中,但这可能不是最佳做法

  constructor(public http: HttpClient, public chart: ChartDetails) {

    this.http.get(`https://siteurl.com/items?$filter=Hub/Title eq 'Project Hub' and Active eq 'Yes'`).subscribe(data => {
      data['value'].forEach(item => {
        let siteCount: number = 0
        this.http.get(`${item.Site}/lists/?$filter=BaseTemplate eq 171`).subscribe(data => {

          data['value'].forEach(list => {
            this.http.get(`${item.Site}/lists(guid'${list.Id}')/items`).subscribe(data => {
              this.myTasks = data['value']

              this.myTasks.forEach(variable => {
                variable.internalListName = list.EntityTypeName.replace("List", "")
              });

              siteCount += data['value'].length
            })
          });

        })

        setTimeout(() => {
          if (siteCount) {
            this.chart.goalChartLabels.push(item.Title)
            this.chart.goalChartData.push(siteCount)
          }
        }, 500);

      });
    })

  }

如果不使用
setTimeout
,当
sitecont
完成时,在下一个项目重置为0之前,如何推送
项目。Title
sitecont

从'rxjs'导入{zip};
...
这是http.get(`https://siteurl.com/items?$filter=activeeq'Yes'`。订阅(数据=>{
数据['value'].forEach(项=>{
this.http.get(`${item.Site}/lists/?$filter=BaseTemplate eq 171`)。订阅(数据=>{
const itemListObservables=数据['value']
.map(list=>this.http.get(`${item.Site}/lists(guid'${list.Id}')/items`);
zip(…itemListObservables)
.订阅(项目列表=>{
const totalCount=itemLists
.map(l=>l.length)
.减少((总和,值)=>总和+值,0)
如果(总计数>0){
this.chart.goalChartLabels.push(item.Title)
this.chart.goalChartData.push(totalCount)
}
itemLists.forEach(变量=>{
variable.internalListName=list.EntityTypeName.replace(“list”,“”);
this.myTasks.push(变量);
});
});
})
});
})
zip
函数等待所有观察值发出一个值并返回它们的数组

关于最佳做法:

  • HttpService调用应至少在ngOnInit中完成。您可能会使用输入来运行这些请求,而它们不会在构造函数中定义
  • 在每一层上使用HTTP请求创建三层嵌套循环并不完美。考虑这是服务器端的单一资源。

  • 您应该使用
    forkJoin()
    发出所有请求,然后获得响应


    使用承诺和
    Promise.all()
    在解决所有承诺时执行操作。@Barmar或OP可以使用
    forkJoin
    ,如果他们想继续使用
    observeable
    s