我正在尝试使用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
管道进行订阅具有相同的效果:不输出任何内容。
我觉得自己做得正确,但是什么也没发生。任何提示都将不胜感激。
答案 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$,
)