首页 > 解决方案 > RxJS forkJoin 不发射值

问题描述

我正在尝试使用forkJoin运算符来组合两个 observables 并输出一个新值。其中一个调用会返回一组对象,其中包含与保险单上多人相关的数据(该部分无法更改)。另一个 observable 告诉我们谁登录了。我正在考虑使用forkJoin来获取两个值并仅为登录用户返回信息。以下是我尝试构建新的 observable 的方式:

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$ =部分并只是订阅(仅用于测试目的)。当我这样做并检查开发人员工具中的网络选项卡时,我看到了第一个调用并成功返回。第二个 observableloggedInPersonBehaviorSubject.asObservableobservable。当我在创建该 observablepipetap服务中时,数据将记录到控制台。因此,从技术上讲,这两个 observable 都可以工作。

我也尝试过forkJoin像上面那样作为对象的参数,以及将每个可观察对象作为自己的参数传递。没有区别,一切都一样。

问题是数据永远不会返回到forkJoin创建它的组件。这里tap显示的管道中的 永远不会被击中,map. 显式订阅或通过async模板中的管道订阅具有相同的效果:不输出任何内容。

我觉得我做得对,但什么也没发生。非常感谢任何提示。

标签: angularrxjs

解决方案


forkJoin仅在每个内部 Observable 完成时才发出。您的 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$,
])

推荐阅读