angular - 为什么使用 RxJS .asObservable() getter/factory 函数模式?
问题描述
在许多使用 RxJS 的代码库中,我似乎遇到了通过普通函数或普通函数公开私有Subjects
的模式。我的问题不是为什么要使用,而是为什么它似乎如此普遍地包装在 getter/factory 函数中?Observables
getter
getObservable()
.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();
问题
- 我不明白的是,
.asObservable()
每次Observable
订阅Subject
. 此外,创建Observable
的内容很热门,可以多次订阅。为什么要创建多个匿名实例Observable
,(每个访问/订阅一个),而不是Observable
在所有观察者订阅的一个类/服务上访问一个,而不是一个? getter/factory function
这种模式有不明显的优势吗?- 可能是因为垃圾收集或测试/模拟优势吗?
到目前为止,我在所有服务/类中使用第二个示例中的实例变量设置,一切似乎都按预期工作,也有多个观察者。
解决方案
何时使用 Subject.prototype.asObservable()
这样做的目的是防止从 API 中泄露 Subject 的“观察者端”。基本上是为了防止当您不希望人们能够“下一个”进入结果的 observable 时出现泄漏的抽象。
您永远不想将 Subject 实例返回到调用上下文。这样做有点类似于返回一个 Deferred 对象而不是一个 Promise;并且,它会使主题对意外和破坏性的使用开放。因此,在公开 Subject 时,您可能希望首先将其转换为 Observable。
为了让它工作,我们可以使用Rx.Observable.prototype.asObservable()
实例方法。
主体本身是热/可共享的,它充当源 Observable 和许多观察者之间的桥梁/代理,使多个观察者可以共享相同的 Observable 执行。
这种 getter/factory 函数模式有不明显的优势吗?
不,完全没有,因为您正在创建一个新的 Observable,并以此 Subject 为源,以将其隐藏在使用 Observable 的代码中。
推荐阅读
- python - 它几乎是相同的功能,但一个正在工作,另一个没有
- c# - UWP 滚动条样式
- windows - 错误无效的 Windows 挂载类型:Windows 容器的 Windows 10 docker 构建上的“绑定”
- javafx - 控制器的 javafx.fxml.LoadException 问题
- python - 使用 numpy 时,Python 是运算符不给出与 id 函数相同的结果
- laravel - 在 Laravel 中部署 Flutter Web
- r - ` 在 R 中,“错误:尝试应用非函数”
- python-3.x - Python DataFrame - ValueError:解包的值太多(预期 2)
- r - 运行具有相同参数的多个函数,但它跳过第一个函数并使用 R 中的管道工打印第二个函数
- react-native - 世博会图标高度