[英]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.