Как вернуть число / переменную с наблюдаемой в угловых? - PullRequest
1 голос
/ 30 сентября 2019

У меня есть угловой сервис, вызывающий API и возвращающий большой объем данных. В этом же вызове GET я делаю некоторую логику, которая подсчитывает, сколько существует каждого типа. У меня простой вопрос: могу ли я отправить эту переменную / число вместе с данными или даже сохранить их в другой переменной и отправить их?

Когда я пытаюсь сохранить их в службе как общедоступную переменную, она не определенакогда я пытаюсь вытянуть его в другой компонент. Я предполагаю, потому что к переменной обращаются, прежде чем на подписку наблюдаемого, но я не знаю, как это исправить?

В приведенном ниже коде _counts - это то, что я пытаюсь вернуть, и это работаетточное ведение журнала внутри метода getPciInfo, но, как я уже сказал, он возвращается как неопределенный где-либо еще. (я пытаюсь передать это число в другой компонент).

Спасибо за любую помощь или совет, который вы можете предложить.

public _counts: any;

getPciInfo(): Observable <Ipcidata[]> {
    return this.httpClient.get<Ipcidata[]>('http://dr0-hlp-07/api/PCIMachines')
      .pipe(
              map(results => {

                const sorted = results.sort(( a, b ) => {
                      const updateDateA = Date.parse(this.datepipe.transform(a.UpdatedDate, 'MM-dd-yyyy'));
                      const carda = determineCardType(a, this.dateMinusMonth, this.dateMinusTwoWeeks)
                      const cardb = determineCardType(b, this.dateMinusMonth, this.dateMinusTwoWeeks)

                      return cardb - carda
                });

                this._counts = sorted.reduce((acc, cur)=>{
                  const cardType = determineCardType(cur, this.dateMinusMonth, this.dateMinusTwoWeeks)

                  switch (cardType) {
                    case 1:
                      acc.green += 1;
                      break;
                    case 2:
                      acc.yellow += 1;
                      break;
                    case 3:
                      acc.red += 1;
                      break;
                  }
                  return acc;
                }, {
                  red: 0,
                  green: 0,
                  yellow: 0
                });
                console.log(this._counts)
                console.log(this._counts.red)

          return sorted;
          }


1 Ответ

2 голосов
/ 30 сентября 2019

Чтобы отправить счет обратно, вы можете сделать:

return ({sorted, counts: _counts});

Чтобы поделиться им между компонентами из этой службы, у вас может быть тема, например:

private countsSource = new Subject();
private counts = this.countsSource.asObservable();

getPciInfo(): Observable <Ipcidata[]> {
    return this.httpClient.get<Ipcidata[]>('http://dr0-hlp-07/api/PCIMachines')
      .pipe(
              map(results => {
                 ....
                 const counts = ...
                 this.countsSource.next(counts)
              });
}

getCounts(): Observable<CountData> {
     return this.counts;
}

В компонентеВы можете использовать его так же, как и другие функции

this.myService.getCounts().subscribe(counts => console.log(counts));

Если вы хотите, чтобы отсчеты отправлялись новым подпискам, вам, возможно, придется использовать BehaviorSubject или ReplaySubject.

...