Angular - Как использовать результат наблюдаемой, внутри другой наблюдаемой? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть наблюдаемая, на которую я подписываюсь и выполняю некоторые операции над значением результата (a reduce() и a map()).

Но внутри этой наблюдаемой я хотел бы назвать другую наблюдаемую это просто возвращает число, и мне нужно это число в моем map().

Вот пример:

this.getYearlyDataByIdAndYear(292, 2019).subscribe(result = > {
        let ferienSaldo: FerienSaldo;
        this.getVacationsYearlyDataByIdAndYear(292, 2019).subscribe(result = > {
            // this is my inner observable and I need to save this result, and use it below!
            ferienSaldo = result;
        });
        this.yearlyOverview = result.reduce < Array < YearlyOverview >> ((prev, current, i, all) = > {
                // some code that is not important
                let overviewVar: YearlyOverview = {
                    saldo: ferienSaldo.value
                };
                prev.push(newTLOverview);
            }
            return prev;
        }, new Array < YearlyOverview > ())
});

в основном, как вы можете видеть, внутри моей исходной Observable мне понадобится значение из внутреннего, и я скопирую это значение в свой reduce(), чтобы назначить его новому объекту, который я создаю!

Проблема с моим кодом заключается в том, что переменная let ferienSaldo не может быть доступным внутри второй наблюдаемой, и, кроме того, я уверен, что есть лучший способ объединить это!

1 Ответ

1 голос
/ 19 февраля 2020

Похоже, что два вызова не зависят друг от друга, поэтому вы можете выполнять их параллельно в forkJoin

forkJoin([
  this.getYearlyDataByIdAndYear(292, 2019).pipe(
    tap(result => this.result1 = result)
  ),
  this.getVacationsYearlyDataByIdAndYear(292, 2019).pipe(
    tap(result => this.result2 = result)
  )
]).subscribe(() => {
  // process this.result1 and this.result2
  // TODO: more meaningful property names
});

Edit:

Я использовал tap, потому что Мне нравится держать тело подписки в чистоте. Вы также можете вернуть результаты в массиве для подписки:

forkJoin([
  this.getYearlyDataByIdAndYear(292, 2019),
  this.getVacationsYearlyDataByIdAndYear(292, 2019)
]).subscribe(result => {
  // process result[0] and result[1]
});

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

...