RxJS forkJoin不发出值

时间:2019-10-31 14:44:20

标签: angular rxjs

我正在尝试使用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$ =部分,只订阅了(仅出于测试目的)。执行此操作并检查开发人员工具中的“网络”选项卡时,我看到了第一个调用并成功返回。第二个可观察值loggedInPersonBehaviorSubject.asObservable可观察值。当我在创建该可观察项的服务中pipetap时,数据将记录到控制台。因此,这两个可观察值在技术上都可以工作。

我还尝试过将forkJoin的参数作为上面的对象,并将每个可观察的参数传递为其自己的参数。没什么区别,一切都一样。

问题在于数据永远不会返回到创建forkJoin的组件。此处显示的管道中的tap从未命中,map也未命中。显式或通过模板中的async管道进行订阅具有相同的效果:不输出任何内容。

我觉得自己做得正确,但是什么也没发生。任何提示都将不胜感激。

1 个答案:

答案 0 :(得分:5)

forkJoin仅在每个内部Observable完成时发出。您的BehaviorSubject尚未完成,因此forkJoin不会发出任何东西。

如果您只关心BehaviorSubject的当前值,则可以使用take(1)

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

或者,如果要在BehaviorSubject获得新值时发出新值,则可以使用combineLatest

this.incentiveStepsHistory$ = combineLatest(
    this._steps.getIncentiveStepsHistory(year),
    this._member.loggedInPerson$,
)