簡體   English   中英

如何從主題創建Observable而不將主題暴露給RxJs v5中的使用者

[英]How to create Observable from Subject without exposing the Subject to consumers in RxJs v5

我正在嘗試從內部使用Rx.Subject的函數返回一個observable。 當然,與任何優秀的API一樣,實現細節應該完全從消費者中抽象出來。 但是,使用Subject.asObservable(),任何使用者都可以向所有觀察者發布新值。

例:

const subject = new Rx.Subject();
const observable = subject.asObservable();

observable.source === subject; // true

observable.forEach(value => console.log(value));
observable.source.next('Hello'); 
// Causes the forEach above to print "Hello"

所以我的問題是,是否有一種內置的方法可以向消費者公開Observable而不讓他們訪問原始主題? 如果不是這在RxJs的部分顯然是糟糕的設計。

注意:這適用於RxJS v5

我知道, 真正封裝它的唯一方法是訂閱函數內的主題,並返回另一個(主題或自定義obervable)發出這些值。

但是任何運算符(甚至像Observable.combineLatest(subject)這樣的創建運算符)都有一些訪問源的方法。

另一種“解決”這種方法的方法是使用Typescript,因為TS編譯器會告訴你,你不能訪問Observable上的受保護屬性source ,因為它不是公共屬性: https//github.com/ReactiveX /rxjs/blob/master/src/Observable.ts#L30 - 當然在ES5中沒有“受保護”這樣的東西,因此它仍然可以通過控制台訪問,例如

暫無
暫無

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

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