gpt4 book ai didi

angular - RxJS forkJoin 不发出值

转载 作者:行者123 更新时间:2023-12-05 09:12:19 28 4
gpt4 key购买 nike

我正在尝试使用 forkJoin 运算符来组合两个可观察值并输出一个新值。其中一个调用返回一组对象,其中包含与保单上的多个人相关的数据(该部分不能更改)。另一个 observable 告诉我们谁登录了。我正在考虑使用 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 可观察对象。当我在创建该可观察对象的服务中 pipetap 时,数据将记录到控制台。因此,从技术上讲,这两个可观察值都有效。

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

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

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

最佳答案

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$,
])

关于angular - RxJS forkJoin 不发出值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58645853/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com