热与冷 Observables

Hot vs Cold Observables

在 RxJS 中,热 Observable 是使用外部生产者的 Observable,而冷 Observable 使用本地生产者(参见 RxJS Hot vs Cold Observable by Ben Lesh)。

Angular HttpClient.post 使用冷 observables 发送数据并在您调用时重复。

在Angular中有什么方法可以知道特定方法是使用热观察还是冷观察?

没有。文档是最安全的选择。另外,我不同意@martin 的评论,这绝对很重要。您需要小心冷观察以避免重新订阅和重新发出昂贵的操作(例如,通过使用多播或将结果保存到主题)。

您还必须依靠文档来了解 when/how 可观察到的完成。例如,您无需担心取消订阅 HttpClient.post,因为您知道它会完成。但是,如果您在 HttpClient 周围使用某种包装器,它通过缓存的 Subject 为请求提供服务,您可能无法再完成。每个组件都会生成一个新的订阅,在组件被销毁后,该订阅将是从 Subject 到组件的引用,因此组件不会被垃圾回收,最终会导致内存泄漏。

无法以编程方式知道您订阅了哪种 Observable,它是否会完成。

一般来说,这可以通过聪明地完成您的可观察对象和使用 takeUntilSubscription 之类的工具来清理对长 运行 未完成可观察对象的订阅来管理,或者昂贵的可观察工作负载。

*编辑:实际上,澄清一下,您需要小心所有可观察对象,而不仅仅是冷可观察对象。热 observables 也会产生昂贵的工作负载。

*EDIT2:更新删除 ActivatedRoute 的示例,因为当组件被销毁时这些可观察对象已完成。

一个 Observable 可以有两种行为:

a) 当订阅者订阅它时,订阅者会收到一组数据。如需接收新数据,您需要重新订阅。

b) 当一个订阅者订阅它时,订阅者不断地接收数据(当数据流改变时)。对于接收新数据,您不需要再次订阅 observable。

在案例 a) 中,我们谈论的是一个 COLD Observervable;

在案例 b) 中我们讨论了一个 HOT Observable;

check this article