如何在不向 RxJs v5 中的消费者公开 Subject 的情况下从 Subject 创建 Observable
How to create Observable from Subject without exposing the Subject to consumers in RxJs v5
我正在尝试从内部使用 Rx.Subject 的函数中 return 一个可观察对象。当然,与任何好的 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
据我所知,要真正封装它的唯一方法是在您的函数中订阅主题,并返回另一个(主题或自定义可观察对象)发出那些值。
但是任何运算符(甚至像 Observable.combineLatest(subject)
这样的创建运算符)都有 一些 访问源的方法。
"solve"另一种方法是使用 Typescript,因为 TS 编译器会告诉您,您无法在 [=12= 上访问受保护的 属性 source
],因为它不是 public 属性:https://github.com/ReactiveX/rxjs/blob/master/src/Observable.ts#L30 - 当然在 ES5 中没有 "protected" 这样的东西,因此它仍然可以通过控制台访问,例如
我正在尝试从内部使用 Rx.Subject 的函数中 return 一个可观察对象。当然,与任何好的 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
据我所知,要真正封装它的唯一方法是在您的函数中订阅主题,并返回另一个(主题或自定义可观察对象)发出那些值。
但是任何运算符(甚至像 Observable.combineLatest(subject)
这样的创建运算符)都有 一些 访问源的方法。
"solve"另一种方法是使用 Typescript,因为 TS 编译器会告诉您,您无法在 [=12= 上访问受保护的 属性 source
],因为它不是 public 属性:https://github.com/ReactiveX/rxjs/blob/master/src/Observable.ts#L30 - 当然在 ES5 中没有 "protected" 这样的东西,因此它仍然可以通过控制台访问,例如