Angular 7 добавление данных к результату http-запроса - PullRequest
1 голос
/ 11 марта 2019

Я получаю массив идентификаторов (assetID) и использую те идентификаторы, которые я хочу запросить для данных. Для каждого http-запроса я получаю один или несколько наборов данных. Я хочу добавить идентификатор запроса в каждый набор данных и затем вернуть данные.

Получение и возврат данных работает отлично, но я не знаю, как добавить этот assetID в набор данных.

Когда я делаю это, как в следующем фрагменте кода, я получаю только первый набор данных каждого идентификатора. (Конечно ... из-за [0]). Но как я могу перебрать все наборы данных?

getData(assetIds: Array<string>): Observable<any> {
  const data = assetIds.map(assetId => {
    // for each assetId
    const path = this.serverUrl + '?' + 'assetid=' + assetId;
    return this.httpClient.get(path).pipe(
      map((res: any[]) => {
        return {
          name: res[0].name,
          type: res[0].type,
          asset: assetId
        };
    }));
});

// return combined result of each assetId request
return forkJoin(data);
}

Я также попробовал следующее, но я не получаю никаких данных при этом:

getData(assetIds: Array<string>): Observable<any> {
 const data = assetIds.map(assetId => {
  // for each assetId
  const path = this.serverUrl + '?' + 'assetid=' + assetId;
  return this.httpClient.get(path).pipe(
    map((res: any[]) => {
      const resultArray = [];
      res.forEach(element => {
        const row = {
          name: res[element].name,
          type: res[element].type,
          asset: assetId
        };
        resultArray.push(row);
      });
      return resultArray;
    }));
});
// return combined result of each assetId request
return forkJoin(data);

}

Ответы [ 3 ]

0 голосов
/ 13 марта 2019

Ваш второй подход кажется нормальным. Я считаю, что проблема в том, что вы используете оператор rxjs forkJoin.

Как говорят документы RXJS, этот оператор выдает значение, когда

Когда все наблюдаемые завершены, выведите последнее испущенное значение из каждого.

У вас есть 2 варианта, смените оператора forkJoin на zip

После того, как все наблюдаемые излучают, излучают значения в виде массива

Или добавьте оператор take(1) после map на pipe. Оператор Take завершит наблюдаемое после выдачи 1 значения, позволяя forkJoin выдавать значения

0 голосов
/ 14 марта 2019

Спасибо за ваши ответы.Я попробовал все, но я думаю, проблема заключалась в том, что я использовал «элемент» в качестве индекса в массиве.Следующий код теперь работает просто отлично:

return this.httpClient.get(path)
  .pipe(
    map((datasets: AssetFilesTableItem[]) => {
      const result: AssetFilesTableItem[] = [];
      let i = 0;
      datasets.forEach(element => {
        const dataset: AssetFilesTableItem = {
          name: datasets[i].name,
          type: datasets[i].type,
          size: datasets[i].size,
          timestamp: datasets[i].timestamp,
          created: datasets[i].created,
          updated: datasets[i].updated,
          asset: assetId
        };
        result.push(dataset);
        i++;
      });

      return result;
    }));
0 голосов
/ 13 марта 2019

Вы можете использовать map также в массиве результатов. Как то так:

const data = assetIds.map(assetId => {
    // for each assetId
    const path = this.serverUrl + '?' + 'assetid=' + assetId;
    return this.httpClient.get(path).pipe(
      map((res: any[]) => res.map(item => {
        return {
          name: item.name,
          type: item.type,
          asset: assetId
        }
      })));
  });

  // return combined result of each assetId request
  return forkJoin(data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...