在 RxJS 中,热 observable 是使用外部生产者的 observable,但冷 observable 使用本地生产者(参见例如Ben Lesh 的 RxJS Hot vs Cold Observable)。
AngularHttpClient.post
使用冷的 observables 发送数据,并在您拨打电话时重复。
Angular 中是否有任何方法可以知道特定方法是使用热观测值还是冷观测值?
在 RxJS 中,热 observable 是使用外部生产者的 observable,但冷 observable 使用本地生产者(参见例如Ben Lesh 的 RxJS Hot vs Cold Observable)。
AngularHttpClient.post
使用冷的 observables 发送数据,并在您拨打电话时重复。
Angular 中是否有任何方法可以知道特定方法是使用热观测值还是冷观测值?
不,文档是最安全的选择。另外,我不同意@martin 的评论,这绝对很重要。您需要小心使用冷可观察对象,以避免重新订阅和重新发布昂贵的操作(例如,通过使用多播或将结果保存到主题)。
您还必须依靠文档来了解 observable 何时/如何完成。例如,您不必担心退订,HttpClient.post
因为您知道它会完成。但是,如果您在 HttpClient 周围使用某种包装器,该包装器通过缓存的主题提供请求,您可能无法再完成。每个组件都将生成一个新的订阅,并且在组件被销毁后,该订阅将是从主题到组件的引用,因此组件不会被垃圾收集,并且最终会导致内存泄漏。
没有办法以编程方式知道您订阅了哪种 Observable,它是否会完成。
一般来说,这是通过聪明地完成你的 observables 和使用工具来管理的,比如takeUntil
或Subscription
清理对长期运行的未完成的 observables 或昂贵的 observable 工作负载的订阅。
*编辑:实际上,为了澄清,你需要小心所有可观察的,而不仅仅是冷的可观察。Hot observables 也会产生昂贵的工作负载。
* EDIT2:更新删除ActivatedRoute的示例,因为这些可观察对象在组件被销毁时完成。
一个 Observable 可以有 2 种行为:
a) 当订阅者订阅它时,订阅者会收到一组数据。要接收新数据,您需要再次订阅它。
b) 当订阅者订阅它时,订阅者连续接收数据(当数据流发生变化时)。为了接收新数据,您不需要再次订阅 observable。
在 a) 的情况下,我们谈论的是 COLD Observervable;
在情况 b) 中,我们谈论的是 HOT Observervable;