循环内多次通话

Moh*_*uik 0 angular angular-httpclient angular4-httpclient angular5 angular6

我是Angular的新手,所以我需要一些帮助,我的问题是打电话给http get,我使用service是我的第一个get

我的第一项服务

 getFirstData() { return this.http.get<FirstDataResults ('http://myurl.com/api/Classes/ads', httpOptions);    
Run Code Online (Sandbox Code Playgroud)

我的组件TS文件

this.data.getFirstData().subscribe(
  data => {
    this.firsobjects = data.results;
  },
  err => console.error(err),
  () => this.getComplementData(this.firstobjects)

);
Run Code Online (Sandbox Code Playgroud)

到现在为止,一切都很好,可以获取我的数据,完成后,我运行第二个函数getComplementData

我的第二次服务

 getSecondData(idFirstObject: String) {

return this.http.get<ComplementDataResults>(
  'http://myurl.com/api/Classes/Complement?' +
  'where={'"idFirstObject":"' + idFirstObject + '"}',
  httpOptions); }   
Run Code Online (Sandbox Code Playgroud)

我的组件TS文件

getComplementData(firsobjects) {
this.number = 0;
for (var _i = 0; _i < firsobjects.length; _i++) {
  this.data.getSecondData(firsobjects[_i].id).subscribe(
    (data) => {
        var a = (data.results);
        this.firsobjects[this.number].complements = a;
    }, err => console.log('error ' + err),
    () => console.log('Ok ')
  );
  }
}
Run Code Online (Sandbox Code Playgroud)

我有第二个函数的问题,我可以提取所有数据,但是问题是,我对循环内的http调用的理解不是按照我理解的顺序来补充数据,因此是异步的。

我的问题是,如何在循环同步中运行http get以获得有序结果。

谢谢 !

Car*_*ten 5

您应该使用rxjs的forkJoin

getComplementData(firsobjects) {
  this.number = 0;
  let calls = [];
  for (var _i = 0; _i < firsobjects.length; _i++) {
    calls.push(this.data.getSecondData(firsobjects[_i].id));
  }

  forkJoin(...calls).subscribe(
    data => { // Note: data is an array now
      var a = (data[0].results);
      this.firsobjects[this.number].complements = a;
    }, err => console.log('error ' + err),
    () => console.log('Ok ')
  );
}
Run Code Online (Sandbox Code Playgroud)

这样的事情。请享用。