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)
);