为什么使用 RxJS .asObservable() getter/factory 函数模式?

tim*_*ner 5 rxjs typescript reactivex angular

在大量使用RxJS代码库的我似乎遇到暴露私人的模式SubjectsObservables通过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)

问题


  • 我undestanding是,.asObservable()创建一个新的Observable每次订阅了的Subject。此外,创建的内容Observable热门,可以多次订阅。为什么人会创建多个匿名实例Observable(每个接入/订阅),而不必只是一个Observable在一个类/服务访问,所有的观察者订阅?
  • 这种getter/factory function模式有什么不明显的优势吗?
  • 可能是因为垃圾收集或测试/模拟优势?

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

Vik*_*kas 3

何时使用Subject.prototype.asObservable()

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

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

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

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

这种 getter/factory 函数模式是否有不明显的优势?
不,一点也不,因为您正在创建一个新的 Observable 并以此主题作为源,以在使用 Observable 的代码中隐藏它。

何时在 rxjs 中使用 asObservable() ?

  • 感谢您的详细回答!不过,正如原件中所述,它可能有点太详细了。问题,我知道为什么/何时使用 `.asObservable()`。问题的要点是发现是否有任何用途将其包装在“getter/factory 函数”中,以便每个客户端都获得一个新的“Observable”,而不是每个客户端都订阅相同的“Observable”。你也回答了这个问题,但最后不是很突出。如果您考虑使这部分更加突出,我可能会赞成您的答案。_(尚未接受,以防万一出现问题)_。 (4认同)