Как и в другом ответе ... если $getShops()
вызывается до того, как установлено значение, вы получите undefined
, поскольку это начальное значение. Вы можете инициализировать его как пустой массив или использовать rxjs filter
для фильтрации значения undefined
. Также я бы связал эти запросы, например, с switchMap
или mergeMap
, так как не рекомендуется вкладывать подписки. Поэтому я предлагаю следующее:
private newShopsSubj = new BehaviorSubject([]);
public newShopsSubj$ = this.newShopsSubj.asObservable();
и код компонента:
import { mergeMap, filter } from 'rxjs/operators';
import { of } from 'rxjs';
// ...
this.shopService.newShopsSubj$.pipe(
mergeMap((shops: any[]) => {
// do a check that that there is an object
if (shops && shops.length) {
return this.shopService.getProductsByShopID(shops[0].id)
}
// no shops, so return...
// empty array, since assuming the above function returns array of products
return of([]);
})
).subscribe((products: any[]) => {
// check if products exist and do your magic!
})
или как уже упоминалось, пусть ваше начальное значение BehaviorSubject будет равно undefined
и filter
от этого значения (s):
this.shopService.newShopsSubj$.pipe(
filter(shops => !!shops)
mergeMap((shops: any[]) => {
// .....
Обратите внимание, что я использовал any
здесь. Не используйте это. Введите ваши данные для моделей! (Я предпочитаю интерфейсы).
И не забудьте отписаться в OnDestroy
!!