3

我正在尝试从内部使用 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"

所以我的问题是,有没有一种内置的方法可以将 Observable 暴露给消费者而不让他们访问原始主题?如果不是,这显然是 RxJs 的糟糕设计。

注意:这是针对 RxJS v5

4

1 回答 1

1

据我所知,真正封装这一点的唯一方法是订阅函数内的主题,并返回另一个(主题或自定义 obervable)发出这些值。

但是任何运算符(甚至是像这样的创建运算符Observable.combineLatest(subject))都可以通过某种方式访问​​源代码。

“解决”此问题的另一种方法是使用 Typescript,因为 TS 编译器会告诉您,您无法访问source上的受保护属性Observable,因为它不是公共属性:https ://github.com/ReactiveX/rxjs /blob/master/src/Observable.ts#L30 - 当然在 ES5 中没有“受保护”之类的东西,因此它仍然可以通过控制台访问,例如

于 2016-12-21T23:42:47.063 回答