Было бы непросто получить правильный синтаксис вашего примера без стекаблика, поэтому я выкладываю один из моих, который, как я знаю, работает, и, надеюсь, вы сможете экстраполировать оттуда:
// All products
products$ = this.http.get<Product[]>(this.productsUrl)
.pipe(
tap(data => console.log('Products', JSON.stringify(data))),
catchError(this.handleError)
);
allProductsAndSuppliers$ = this.products$
.pipe(
switchMap(products => forkJoin(
products.map(product =>
forkJoin(product.supplierIds.map(supplierId => this.http.get<Supplier>(`${this.suppliersUrl}/${supplierId}`)))
.pipe(
map(suppliers => ({
...product,
suppliers: suppliers
} as Product))
)
))
)
);
Я разбил его на две части:
Поток products$
получает все продукты. Похоже, вы делаете что-то похожее, чтобы получить все устройства.
Затем я использую поток products$
и получаю всех поставщиков для этого продукта, определенного как allProductsAndSuppliers$
.
Во втором потоке я сначала использую switchMap
для выполнения еще одного http-запроса для каждого продукта.
Затем я использую forkJoin
для переиздания набора продуктов в виде массива.
Внутри первого forkJoin я использую оператор карты массива products для "обхода" каждого продукта. Для каждого продукта я использую еще один forkJoin
, чтобы найти всех поставщиков и выдать их в виде массива.
Внутри второго forkJoin я получаю каждого поставщика, как определено в свойстве productIds продукта.
Я передаю результат через оператор карты, который создает Product
, содержащий копию продукта и список его поставщиков.
Для справки, мой интерфейс Product выглядит следующим образом:
export interface Product {
id: number;
productName: string;
productCode?: string;
description?: string;
supplierIds?: number[];
suppliers?: Supplier[];
}
Я использую набор поставщиков, полученных вместе с продуктом, для заполнения массива поставщиков.
Применимо ли это к вашему сценарию?