I’ve got a request that returns something like this get(‘/product-list)
[
{
product_id: 1,
description: 'product 1',
color_id: 1
},
{
product_id: 2,
description: 'product 2',
color_id: 2
},
...
]
To obtain de color_id information I have to perform another request to something like get(‘color/1’)
I want to obtain something like
{
product_id: 1,
description: 'product 1',
color_id: 1,
color_detail: {object_with_full_color_detail}
},
I was able to obtain it with something like this:
this.getProductList().subscribe(productList => {
const detailsObservables = productList.map(product => {
return this.getColorDetail(product.color_id);
});
forkJoin(colorObservables).subscribe(colorDetailResponses) {
const productListWithColorInfo = productList.map((product, index) => {
return {...product, color_info: colorDetailResponses[index]};
});
}
});
I tried mergeMap to resolve this in a single process, but i couldn’t perform the inner request for every item in the productList.
Any idea to resolve this?
Thanks in advance
Advertisement
Answer
MergeMap should work.
this.getProductList().pipe(
// Create a request for each product
map(productList => productList.map(product =>
this.getColorDetail(product.color_id).pipe(
// Map result of request and product together
map((colorDetailResponses, index) => ({
...product,
color_info: colorDetailResponses[index]
}))
)
),
// Run the requests
mergeMap(requests => forkJoin(requests))
).subscribe(
productListWithColorInfo =>
console.log("Received: ", productListWithColorInfo)
);
Combine Map and MergeMap
this.getProductList().pipe(
mergeMap(productList => forkJoin(
productList.map(product =>
this.getColorDetail(product.color_id).pipe(
map((colorDetailResponses, index) => ({
...product,
color_info: colorDetailResponses[index]
}))
)
)
)
).subscribe(
productListWithColorInfo =>
console.log("Received: ", productListWithColorInfo)
);