Труба Наблюдаемая подписка с картой угловая - PullRequest
1 голос
/ 31 октября 2019

На самом деле я хочу вызвать другую функцию со значением массива в качестве параметра. Я получаю массив от темы:

this.shopService.$getShops().pipe(map(
  shops => {
    console.log(shops[0]);
  }
)).subscribe();

Подписка основана на этом:

      private newShopsSubj = new BehaviorSubject(undefined);

  setShops(shops: any) {
    this.newShopsSubj.next(shops);
  }


  $getShops(): Observable<any> {
    return this.newShopsSubj.asObservable();
  }

На самом деле код работает ... но вызов console.log заканчивается наundefined. Почему-то я не нахожу подходящего решения.

Я хочу сделать так:

   this.shopService.$getShops().subscribe(resp => {
this.shopService.getProductsByShopID(resp[0].id).subscribe(resp
=> {do something...};});

Но на самом деле это не получается, поскольку resp[0].id остается undefined ... Мои попытки с картой не увенчались успехом.

Любая помощь высоко ценится ...

Спасибо

Хучо

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Как и в другом ответе ... если $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 !!

0 голосов
/ 31 октября 2019

BehaviourSubject испускает текущее значение для новых подписчиков.

здесь вы инициализируете его с undefined начальным значением

private newShopsSubj = new BehaviorSubject(undefined);

Таким образом, когда вы подписываетесь, как показано ниже

  this.shopService.$getShops().subscribe(resp => {
this.shopService.getProductsByShopID(resp[0].id).subscribe(resp
=> {do something...};});

Первоначально он получит resp как неопределенное. чтобы исправить это, вы можете использовать Subject вместо BehaviorSubject или инициализировать BehaviourSubject с соответствующим объектом магазина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...