Несколько вызовов внутри цикла - PullRequest
0 голосов
/ 27 июня 2018

Я новичок в Angular, поэтому мне нужна помощь. Моя проблема заключается в том, чтобы позвонить по http get. Я пользуюсь сервисом. Это мой первый get

.

Мой первый Сервис

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

Файл моего компонента TS

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

);

До сих пор всегда все в порядке, я могу получить мои данные, и, когда все будет готово, я запускаю вторую функцию getComplementData

.

Моя вторая служба

 getSecondData(idFirstObject: String) {

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

Файл моего компонента 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 ')
  );
  }
}

У меня проблема с этой второй функцией, я могу получить все данные, но проблема в том, что данные дополнения не упорядочены из того, что я понял, вызов http внутри моего цикла параллелен, поэтому async.

У меня вопрос: как я могу запустить http для синхронизации внутри цикла, чтобы получить упорядоченные результаты.

Спасибо!

1 Ответ

0 голосов
/ 27 июня 2018

Вы должны использовать 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 ')
  );
}

Нечто подобное. Наслаждайтесь.

...