Обновление списка объектов в наблюдаемой с использованием RxJS 6 и Angular 6 - PullRequest
0 голосов
/ 15 марта 2019

Мне предоставляются два доступных API REST, которые называются 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 голосов
/ 15 марта 2019

Это может быть способ сделать это:

  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. Я использую комбинированиеПоследний, чтобы дождаться возврата всех цен, прежде чем возвращать все.

...