Объединить все ответы в один наблюдаемый из forEach? - PullRequest
0 голосов
/ 24 февраля 2020

Мне нужно сделать вызовы REST API для каждого элемента в массиве. Каков наиболее эффективный способ собрать его в единую наблюдаемую? Ответ от сервера представляет собой массив объектов. Мне нужен только один массив, а не массив массив объектов. Потому что это возвращает это. Есть идеи?

Мой текущий метод:

  getDocumentsByGroupId() {
    this.form.formGroups.forEach(group =>
      this.documentService.findApprovedDocumentsUsingGET(this.possibility.DOCUMENT_FORM_GROUP, group.id.toString(), 'body', false, false)
        .subscribe(documents => this.documentList.push(documents)));
  }

1 Ответ

1 голос
/ 24 февраля 2020

Используйте forkJoin, если вы хотите подписаться на несколько наблюдаемых параллельно.

getDocumentsByGroupId() {
  // create an array of observables - won't be run until subscribe is called
  const observables = this.form.formGroups
    .map(group => this.mapGroupToObservable(group));

  forkJoin(observables).subscribe(documents => {
    // documents will be an array of all the responses
    console.log(documents);
    // [ ... ]
  });
}

private mapGroupToObservable(group) {
  return this.documentService
   .findApprovedDocumentsUsingGET(this.possibility.DOCUMENT_FORM_GROUP,
     group.id.toString(), 'body', false, false)
}

forkJoin будет запускать все наблюдаемые параллельно и вызывать ваш обратный вызов подписки при возврате последней. .

Я разбил ваш код на части, чтобы сохранить настройки в чистоте для облегчения понимания ответа.

Обычно я тоже набираю функции и переменные, но я не был уверен ваших типов.

Сведение объектов ответа

Если вы хотите преобразовать ваш массив массивов в плоский массив, вы можете использовать .flat() или .reduce().

плоская

Нет IE поддержка - необходимо заполнить поли

const flattened = documents.flat();

уменьшить

const flattened = documents.reduce((acc, val) => acc.concat(val), []);

Пример уменьшения прямо из MDN документов для квартиры

...