angular - 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$ =
部分并只是订阅(仅用于测试目的)。当我这样做并检查开发人员工具中的网络选项卡时,我看到了第一个调用并成功返回。第二个 observableloggedInPerson
是BehaviorSubject.asObservable
observable。当我在创建该 observablepipe
的tap
服务中时,数据将记录到控制台。因此,从技术上讲,这两个 observable 都可以工作。
我也尝试过forkJoin
像上面那样作为对象的参数,以及将每个可观察对象作为自己的参数传递。没有区别,一切都一样。
问题是数据永远不会返回到forkJoin
创建它的组件。这里tap
显示的管道中的 永远不会被击中,map
. 显式订阅或通过async
模板中的管道订阅具有相同的效果:不输出任何内容。
我觉得我做得对,但什么也没发生。非常感谢任何提示。
解决方案
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$,
])