RxJS可观察-订阅时附加主题使用者

时间:2019-03-07 17:06:58

标签: javascript angular rxjs

我有一个Angular服务,该服务保留私有BehaviorSubject,以便它可以在任何给定时间读取值。它是私有的,因此使用它的任何组件都无法对其进行操作。而是将常规Observable公开。 BehaviorSubject现在是此可观察对象发出的任何数据的使用者。

public subheaderData$: Observable<SubheaderData>;
private subheaderDataSubject$: BehaviorSubject<SubheaderData> = new BehaviorSubject<SubheaderData>(null);

constructor(private repository: SubHeaderRepository) {
    this.subheaderData$ = this.load();
    this.subheaderData$.subscribe(this.subheaderDataSubject$);
}

如您所见,我正在通过服务呼叫.subscribe,这使我的可观察性立即变热。我要实现的是,注入此服务的组件必须订阅公共Observable,并且在发生这种情况时,BehaviorSubject应该自动添加为观察者,即使该组件没有关于它的知识(由于它是私有的。

这怎么实现?

2 个答案:

答案 0 :(得分:1)

在您的服务构造函数中执行此操作

this.subheaderData$ = this.subheaderDataSubject$.asObservable();

然后在需要时订阅subheaderData$

您可以this.subheaderDataSubject$.next(someValue)使用服务

答案 1 :(得分:1)

如果我没有遗漏任何重要信息,我认为即使使用这是一个不寻常的用例,您也只能使用multicast来完成您想要的事情。

subheaderDataPublic$ = this.subheaderData$.pipe(
  multicast(this.subheaderDataSubject$, s => s),
);

然后您将在组件中订阅subheaderDataPublic$

通常,您将使用multicast这样的示例:

multicast(new Subject(), s => merge(s, s.pipe(...)))

...但是如果您通过this.subheaderDataSubject$,它将用作中间主题。上面的s => s是必需的,因为没有任何选择器函数multicast会返回ConnectableObservable的实例,这可能是您不需要的。

编辑:也许更容易理解的解决方案是只使用Observable构造函数。

subheaderDataPublic$ = new Observable(observer => {
  const subscriptions = new Subscription();
  subscriptions.add(this.subheaderData$.subscribe(this.subheaderDataSubject$));
  subscriptions.add(this.subheaderDataSubject$.subscribe(observer));

  return () => subscriptions.unsubscribe();
});