tim*_*ner 5 rxjs typescript reactivex angular
在大量使用RxJS代码库的我似乎遇到暴露私人的模式Subjects为Observables通过getter或正常getObservable()功能。我的问题不是为什么.asObservable()要使用,而是为什么它看起来如此普遍地包含在 getter/factory 函数中?
asObservable() 包裹在 getter/factory 函数中
private readonly _engineInfo$ = new Subject<EngineInfo>();
get engineInfo$() { return this._engineInfo$.asObservable(); }
Run Code Online (Sandbox Code Playgroud)
asObservable() 作为实例变量
private readonly _engineInfo$ = new Subject<EngineInfo>();
public engineInfo$ = this._engineInfo$.asObservable();
Run Code Online (Sandbox Code Playgroud)
问题
.asObservable()创建一个新的Observable每次订阅了的Subject。此外,创建的内容Observable很热门,可以多次订阅。为什么人会创建多个匿名实例Observable,(每个接入/订阅),而不必只是一个Observable在一个类/服务访问,所有的观察者订阅?getter/factory function模式有什么不明显的优势吗?到目前为止,我在所有服务/类中使用第二个示例中的实例变量设置,一切似乎都按预期工作,也有多个观察者。
这样做的目的是防止从 API 中泄露主题的“观察者端”。基本上是为了防止当您不希望人们能够“下一步”进入结果可观察值时出现抽象泄漏。
您永远不想将主题实例返回到调用上下文。这样做有点类似于返回一个 Deferred 对象而不是一个 Promise;并且,它会使主题暴露于意外和破坏性的使用。因此,当公开一个主题时,您可能希望首先将其转换为可观察对象。
为了使其正常工作,我们可以使用Rx.Observable.prototype.asObservable()实例方法。
主题本身是热门/可共享的,它充当源 Observable 和许多观察者之间的桥梁/代理,使得多个观察者可以共享相同的 Observable 执行。
这种 getter/factory 函数模式是否有不明显的优势?
不,一点也不,因为您正在创建一个新的 Observable 并以此主题作为源,以在使用 Observable 的代码中隐藏它。
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |