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

Angular 为什么要使用RxJS.asObservable()getter/factory函数模式?,angular,typescript,rxjs,reactivex,Angular,Typescript,Rxjs,Reactivex,在许多使用RxJS的代码库中,我似乎遇到了通过getter或normalgetObservable()函数将私有主题暴露为可观察对象的模式。我的问题不是为什么要使用.asObservable(),而是为什么它看起来如此普遍地包装在getter/factory函数中 a包装在getter/factory函数中的可观察()函数 private readonly_engineInfo$=new Subject(); 获取engineInfo$(){返回此项。_engineInfo$.asObserv

在许多使用RxJS的代码库中,我似乎遇到了通过
getter
或normal
getObservable()函数将私有
主题
暴露为
可观察对象的模式。我的问题不是为什么要使用
.asObservable()
,而是为什么它看起来如此普遍地包装在getter/factory函数中

a包装在getter/factory函数中的可观察()函数


private readonly_engineInfo$=new Subject();
获取engineInfo$(){返回此项。_engineInfo$.asObservable();}
asObservable()作为实例变量


private readonly_engineInfo$=new Subject();
public engineInfo$=此。_engineInfo$.asObservable();
问题


  • 我的理解是,
    .asObservable()
    每次订阅
    主题时都会创建一个新的
    可观察的
    。另外,创建的
    可观察的
    是热的,可以订阅多次为什么要创建多个
    可观察的
    (每个访问/订阅一个)匿名实例,而不是只有一个
    可观察的
    ,在所有观察者订阅的一个类/服务上访问?
  • 这种
    getter/factory函数
    模式是否有不明显的优势
  • 这可能是因为垃圾收集或测试/模拟的优点吗
到目前为止,我在所有服务/类中都使用了第二个示例中的实例变量设置,并且似乎一切都按照预期工作,同时还有多个观察者。

何时使用Subject.prototype.asObservable() 这样做的目的是防止对象的“观察者端”从API中泄漏。基本上是为了防止在您不希望人们能够“下一步”进入结果可观察对象时出现泄漏的抽象

您永远不希望将主题实例返回到调用上下文。这样做在某种程度上类似于返回延迟对象,而不是承诺;而且,它会让这个主题被意外地、腐败地使用。因此,当暴露一个对象时,您可能首先要将其转换为可观察对象

为了实现这一点,我们可以使用
Rx.Observable.prototype.asObservable()
实例方法

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

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


我必须说,这是我第一次听说getter factory模式被认为是用于观察的常用模式。我假设这两种方法适合不同的用例,我会选择最适合您的一种。我只是称之为“模式”,因为在每个RxJS/Angular代码库(在我的公司)中,它似乎是访问对象可观察性的标准方法。所以我认为它一定很受欢迎,是最佳实践,并且有一些原因。。。。!?你能详细说明一下你提到的不同用例吗?为什么在实践中你会想要一个新的
Observable
实例,而不是向一个中心热点
Observable
添加另一个订阅?我不知道!我只想重用一个可观察的实例。Subject是一个可观察的实例,不需要执行这种转换。上面的代码可以用来禁用调用
主题。下一步(某物)
问“为什么…”问题是一件危险的事情,因为这些问题很容易被视为征求意见,但我认为这个问题的情况并非如此,因为这个问题的措辞很仔细,是为了征求技术上的意见,而不是意见。投票重新开放。感谢您的详细回答!但它可能有点过于详细,因为,正如orig中所述。问题,我知道为什么/何时使用
.asObservable()
。问题的要点是揭示将其包装在
getter/factory函数中是否有任何用处,这样每个客户机都可以获得一个新的
可观察的
,而不是每个客户机都订阅相同的
可观察的
。你也回答了这个问题,但在最后不是很突出。如果你认为这个部分更突出,我可能会赞成你的答案。我认为,与其使用getter,不如使用由
shareReplay(1)
()管道传输的只读实例。我是从你那里得到这个主意的