使用RxJS 6和Angular 6更新可观察对象内的对象列表

时间:2019-03-14 23:41:39

标签: angular rxjs observable

我提供了两个REST API,分别称为Product和Price。

我所面临的问题是按产品名称搜索时。用户将提供一个“查询”,并且产品API将返回与此名称匹配的所有产品。然后,我需要获取此列表,在每个项目之间循环以获取sku,然后调用价格API以获取价格信息。

我用于“产品”和“价格”的方法是:

getProductListByQuery(query: string): Observable<Product[]> {
   return this.http.get<Product[]>(this.productEndpoint + '/' + query);
}

getPriceBySku( sku: string): Observable<Price> {
   return this.http.get<Price>(this.priceEndpoint + '/' + sku);
}

产品对象如下:

import { Price } from './inventory';

export class Product {
  sku: string;
  name: string;
  status: string;
  price: Price;  
}

我想遍历所有产品并更新价格

我已经尝试过使用forkJoin,mergeMap,switchMap,concatMap以及任何我可以阅读的内容...但是我认为归结为我只是不了解自己在尝试什么要做...这将解释为什么我不了解结果。

我的方法如下:

getProductandPriceByQuery(query: string): Observable<Product[]> {
   return this.productService.getProductListByQuery( query ).pipe(
           //  I want to loop through each Product and add Price.
           //  I am just stumped.
}

1 个答案:

答案 0 :(得分:0)

这可能是一种方法:

  getProductandPriceByQuery(query: string): Observable<Product[]> {

    return this.productService.getProductListByQuery( query ).pipe(

      switchMap(products => {
        const productWithPriceObservables = products.map(product => { 
          return this.productService.getPriceBySku( product.sku )
            .pipe(
              map(price => Object.assign(product, {price: price}))
            );
        });
        return combineLatest(productWithPriceObservables);
      })

    )

 }
  1. 首先我得到了产品。
  2. 然后我使用“ switchMap”说我将跳转到一个新的可观察对象。根据您的用例,“ mergeMap”在这里也将是有效的选项。
  3. 对于每个产品,我都询问价格,然后将价格合并到产品中:

    map(price => Object.assign(product, {price: price}))
    
  4. 在返回所有内容之前,我使用CombineLatest等待所有价格返回。