【问题标题】:How to create Observable from Subject without exposing the Subject to consumers in RxJs v5如何在 RxJs v5 中从 Subject 创建 Observable 而不将 Subject 暴露给消费者
【发布时间】:2016-12-21 22:37:29
【问题描述】:

我试图从一个在内部使用 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

【问题讨论】:

    标签: javascript rxjs observable rxjs5 subject-observer


    【解决方案1】:

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

    但是任何运算符(甚至像 Observable.combineLatest(subject) 这样的创建运算符)都有一些方法来访问源代码。

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

    【讨论】:

    • 欣赏答案!不幸的是,我不在 Typescript 环境中工作。是否有一个有效的、非 hacky 的用例用于从 observable 的消费者访问源?这应该是一个明确的选择。完全可以在 JS 中封装状态,所以我不认为必须公开源,或者至少向消费者公开 observables 的默认机制应该公开它。
    • 这是绝对正确的,在 JS 中有有效的方法可以做到这一点——我最好的办法是打开一个 github 问题。据我所知,rxjs5 是在考虑 TS 的情况下构建的,但这很快就会变得固执己见,这是错误的地方。
    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2012-04-22
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多