Angular RXJS多个HTTP嵌套请求

时间:2018-07-13 16:23:58

标签: angular rxjs angular2-observables fork-join

我可以使用forkjoin运算符成功进行多个并行的http调用(例如,调用所有销售数据),但是我需要根据每个第一个(sales)http调用的结果来连接更多的http调用。我不确定mergeMap或concat运算符是否最好,以及它们在这里的位置如何

示例数据是 销售

{saleId:100, name:'bob, uri:'http://testserver/sales/100'}
{saleId:101, name:'fred, uri:'http://testserver/sales/101'}
{saleId:102, name:'billy, uri:'http://testserver/sales/102'}


products
{id:1,saleId:101, detail:'test1', product:{id:200, uri:'http://testserver/product/200'} }
{id:1,saleId:101, detail:'test1', product:{id:201, uri:'http://testserver/product/201'} }
{id:1,saleId:101, detail:'test1', product:{id:202, uri:'http://testserver/product/202'} }

getServerChildNodes(childNodeObj: any[]): Observable<any> {
    //observablesListArray contains http sales uri
    return forkJoin(observablesListArray)
        .map((data: any[]) => {
            for (let i = 0; i < data.length; i++) {
               outputData.push(data[i].json());
            }
            return outputData;
        });
}

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了您的问题,但是您似乎正在寻找一种方法来连接2个后续的http调用,第二个要求第一个返回一些数据。另外,您希望并行运行许多这样的链接调用。

如果是这种情况,这可能是一种解决方法。

getSaleIds(): Observable<string[]>;

getSale(id: string): Observable<Sale> {
  // calls and http service and returns a Sale for a certain id
  // each Sale contains a productId to be used in the subsequent call
}

getProduct(productId: string): Observable<Product> {
  ...
}

getSaleAndThenProduct(saleId: string) {
  return getSale(saleId).pipe(
    switchMap(sale => getProduct(sale.productId),
    map(product => ({sale, product}))
  );
}

getSaleIds()
.pipe(
  map(saleIds => saleIds.map(id => getSaleAndThenProduct(id)),
  switchMap(functions => forkJoin(functions))
)
.subscribe(salesAndProducts => // do something)

salesAndProducts{sale: Sale, product: Product}类型的对象的数组