首页 > 解决方案 > 为什么使用 RxJS .asObservable() getter/factory 函数模式?

问题描述

在许多使用 RxJS 的代码库中,我似乎遇到了通过普通函数或普通函数公开私有Subjects的模式。我的问题不是为什么要使用,而是为什么它似乎如此普遍地包装在 getter/factory 函数中?ObservablesgettergetObservable().asObservable()

asObservable() 包装在 getter/factory 函数中


private readonly _engineInfo$ = new Subject<EngineInfo>();
get engineInfo$() { return this._engineInfo$.asObservable(); }

asObservable() 作为实例变量


private readonly _engineInfo$ = new Subject<EngineInfo>();
public engineInfo$ = this._engineInfo$.asObservable();

问题


到目前为止,我在所有服务/类中使用第二个示例中的实例变量设置,一切似乎都按预期工作,也有多个观察者。

标签: angulartypescriptrxjsreactivex

解决方案


何时使用 Subject.prototype.asObservable()

这样做的目的是防止从 API 中泄露 Subject 的“观察者端”。基本上是为了防止当您不希望人们能够“下一个”进入结果的 observable 时出现泄漏的抽象。

您永远不想将 Subject 实例返回到调用上下文。这样做有点类似于返回一个 Deferred 对象而不是一个 Promise;并且,它会使主题对意外和破坏性的使用开放。因此,在公开 Subject 时,您可能希望首先将其转换为 Observable。

为了让它工作,我们可以使用Rx.Observable.prototype.asObservable()实例方法。

主体本身是热/可共享的,它充当源 Observable 和许多观察者之间的桥梁/代理,使多个观察者可以共享相同的 Observable 执行。

这种 getter/factory 函数模式有不明显的优势吗?
不,完全没有,因为您正在创建一个新的 Observable,并以此 Subject 为源,以将其隐藏在使用 Observable 的代码中。

什么时候在 rxjs 中使用 asObservable()?


推荐阅读