簡體   English   中英

RxJS可觀察-訂閱時附加主題使用者

[英]RxJS Observable - attach Subject consumer on subscribe

我有一個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應該自動將BehaviorSubject添加為觀察者。私人的。

如何做到這一點?

在您的服務構造函數中執行此操作

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

然后在需要時訂閱subheaderData$

您可以在服務中使用this.subheaderDataSubject$.next(someValue)

如果我沒有錯過任何重要的事情,我想您應該僅通過使用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();
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM