Javascript 在RxJs v5中,如何从主题创建可观察的对象,而不将主题暴露给消费者

Javascript 在RxJs v5中,如何从主题创建可观察的对象,而不将主题暴露给消费者,javascript,rxjs,observable,rxjs5,subject-observer,Javascript,Rxjs,Observable,Rxjs5,Subject Observer,我试图从一个内部使用Rx.Subject的函数返回一个可观测值。当然,与任何好的API一样,实现细节应该完全从消费者那里抽象出来。但是,使用Subject.asObservable()时,任何使用者似乎都可以向所有观察者发出新值 例如: const subject = new Rx.Subject(); const observable = subject.asObservable(); observable.source === subject; // true observable.fo

我试图从一个内部使用Rx.Subject的函数返回一个可观测值。当然,与任何好的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"
所以我的问题是,有没有一种内在的方式,可以让消费者在不接触原始主题的情况下,暴露一个可观察的对象?如果不是这样的话,RxJs的设计显然很糟糕


注意:这是针对RxJS v5的,据我所知,要真正地封装它,唯一的方法是订阅函数中的主题,并返回另一个(主题或自定义obervable)来发出这些值

但是任何操作符(即使是创建操作符,如
Observable.combinelatetest(subject)
)都有一些方法来访问源代码


“解决”这一问题的另一种方法是使用Typescript,因为TS编译器会告诉您,您无法访问
可观察的
上的受保护属性
,因为它不是公共属性:-当然在ES5中没有“受保护”这样的东西因此,仍然可以通过控制台访问,例如

感谢您的回答!不幸的是,我没有在Typescript环境中工作。是否有一个有效的、非黑客的用例用于从可观测数据的消费者处访问源?这应该是一个明确的选择。在JS中封装状态是完全可能的,所以我不认为源必须公开,或者至少向消费者公开可观察对象的默认机制应该公开它。在JS中有有效的方法来做到这一点是绝对正确的-我认为你最好的选择是打开github问题。据我所知,rxjs5是在考虑TS的情况下构建的,但这很快就变得固执己见,这是一个错误的地方。