【发布时间】:2018-08-31 22:19:10
【问题描述】:
我有以下要求。
我有一个带有 BehaviorSubject 的 Angular 服务。 完成了一个 http 请求,完成后,将使用该值调用 BehaviorSubject.next 方法。 该值可以在单个页面的生命周期内发生变化。
不同的订阅者注册到它,并在它发生变化时被调用。
问题在于,当 http 请求处于挂起状态时,BehaviorSubject 已经包含一个默认值,而订阅者已经立即获得了这个值。
我想要的是订阅者必须等到 http 请求完成(延迟)并在 http 请求完成时获取值并设置值。 所以我需要的是某种延迟行为主体机制。
我将如何使用 rxjs 实现这一点?
另一个要求是,如果我在某个方法中订阅行为主体,我们希望订阅者获得第一个非默认值并且订阅结束。我们不希望重新执行函数中的本地订阅。
【问题讨论】:
-
为什么不直接暴露http调用返回的Observable,需要经过一个BehaviorSubject呢?
-
听起来你可以切换到
ReplaySubject(1),就是这样。 -
实际上 http 调用并没有在 BehaviorSubject 中创建值。它执行用于身份验证的后端调用,创建一个 cookie(遗留代码),当 http 调用完成后,我们根据 cookie 中的信息组成一个对象。此外,由于应用程序中的一些其他非 http 操作,该对象的值可能会发生变化(不再有 http 请求)。
-
订阅者不知道值是由于 http 请求还是非 http 操作而发生变化。他们只需要获取最新的值。
-
我在玩 ReplaySubject。我还想要的是,如果在一个方法中订阅了主题:我们等到第一个值被发出,然后我们取消订阅以防止方法中的订阅被一遍又一遍地调用。