Angular合并来自多个HTTP请求的数据

时间:2019-03-08 10:25:50

标签: angular httpclient

我想使用角度服务中的httpClient从远程源获取几个不同ProductId的数据。 我想在服务中合并数据,然后将其返回。

仅使用一个productId,就可以正常工作:

getData(productId: string): Observable<any> {
  const path = this.serverUrl + '?' + 'productId=' + productId;
  return this.httpClient.get(path);
}

但是我如何遍历一系列产品ID,然后返回合并的结果?

getData(productIds: Array<string>): Observable<any> {
  let data: Array<string>;

  productIds.forEach(element => {
     const path = this.serverUrl + '?' + 'productid=' + element;
     data.push(this.httpClient.get(path));
  });

  return data;

}

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

如果要并行请求其他产品,可以使用forkJoin运算符:

getData(productIds: Array<string>): Observable<any> {  
  const data = productIds.map(element => {
     const path = this.serverUrl + '?' + 'productid=' + element;
     return this.httpClient.get(path);
  };
  return forkJoin(...data);
}

答案 1 :(得分:1)

您可以尝试使用forkJoin

[P.S。]以下代码未经测试

 let productAPIs = [1,2,3,4];

 productIds.forEach(element => {
    const path = this.serverUrl + '?' + 'productid=' + element;
    productAPIs.push(this.http.get(path);
 });


 forkJoin(productAPIs).subscribe(results => {
    // results[0] is your productId[0]
    // results[1] is your productId[1]
 });

答案 2 :(得分:0)

您应该看看the zip function from RXJS。它将来自不同可观察对象的所有结果组合到一个数组中。

getData(productIds: Array<string>): Observable<any> {
  let data: Array<Observable<any>>;

  productIds.forEach(element => {
     const path = this.serverUrl + '?' + 'productid=' + element;
     data.push(this.httpClient.get(path));
  });

  return zip(data);
}