RxJS forkJoin не выдает значения - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь использовать оператор forkJoin для объединения двух наблюдаемых и вывода нового значения. Один из вызовов возвращает массив объектов с данными, относящимися к нескольким людям в страховом полисе (эта часть не может измениться). Другая наблюдаемая говорит нам, кто вошел в систему. Я думал об использовании forkJoin, чтобы получить оба значения и вернуть информацию только для вошедшего в систему пользователя. Вот как я пытаюсь создать эту новую наблюдаемую информацию:

this.incentiveStepsHistory$ = forkJoin({
    incentiveStepsHistory: this._steps.getIncentiveStepsHistory(year),
    loggedInPerson: this._member.loggedInPerson$,
}).pipe(
    tap((data: any) => console.log(data)),
    map((data: any) => {
        // get the data that I want
    })
    untilDestroyed(this),
)

Я пробовал этот способ, а также избавлялся от части this.incentiveStepsHistory$ = и просто подписывался (только для целей тестирования). Когда я делаю это и проверяю вкладку «Сеть» в инструментах разработчика, я вижу первый сделанный звонок и возвращаюсь успешно. Вторая наблюдаемая loggedInPerson - наблюдаемая BehaviorSubject.asObservable. Когда я pipe и tap в службе, где создается эта наблюдаемая, данные записываются на консоль. Так что обе наблюдаемые работают технически.

Я также пробовал параметр forkJoin, являющийся объектом, подобным приведенному выше, а также передавал каждую наблюдаемую в качестве своего собственного параметра. Нет разницы, все работает одинаково.

Проблема в том, что данные никогда не возвращаются в компонент, где создается forkJoin. tap в трубе, показанной здесь, никогда не попадет, как и map. Подписка либо явным образом, либо через канал async в шаблоне имеет тот же эффект: ничего не выводится.

Я чувствую, что все сделал правильно, но ничего не происходит. Любые советы приветствуются.

1 Ответ

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

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

Вы можете использовать take(1), если вам важно только текущее значение из вашего BehaviorSubject.

this.incentiveStepsHistory$ = forkJoin({
    incentiveStepsHistory: this._steps.getIncentiveStepsHistory(year),
    loggedInPerson: this._member.loggedInPerson$.pipe(take(1)),
})

Иливы можете использовать combineLatest, если хотите выдавать новые значения, когда ваш BehaviorSubject получает новое значение.

this.incentiveStepsHistory$ = combineLatest(
    this._steps.getIncentiveStepsHistory(year),
    this._member.loggedInPerson$,
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...