我可以使用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;
});
}
答案 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}
类型的对象的数组