【问题标题】:Hot vs Cold ObservablesHot vs Cold Observables
【发布时间】:2017-09-06 15:50:50
【问题描述】:

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

Angular HttpClient.post 使用冷的 observables 发送数据,并在您拨打电话时重复。

Angular 中是否有任何方法可以知道特定方法是使用热可观察对象还是冷可观察对象?

【问题讨论】:

  • 我不这么认为,而且我相信在实践中说实话并不重要。只要遵循常识:)。例如,正如你所说的 HttpClient.post 是冷的,但 ActivatedRoute.params 是一个热的 Observable,这是有道理的(它是一个内部的 Subject 实例,即使你没有订阅它也需要存在)。

标签: angular rxjs angular-httpclient


【解决方案1】:

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

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

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

一般而言,这既可以通过聪明地完成您的 observable 来管理,也可以通过使用 takeUntilSubscription 等工具来清理对长期运行的未完成 observable 或昂贵的 observable 工作负载的订阅。

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

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

【讨论】:

  • ActivatedRoute observables do 在组件销毁时完成,因此您不必手动取消订阅。 angular.io/guide/router#observable-parammap-and-component-reuse
  • @kevin:文章没有说明 ActivatedRoute.params 曾经完成过。当组件死亡时,整个激活的路由将与组件一起被简单地垃圾收集。如果您在某个长期存在的对象中保留对注入的 ActivatedRoute 的引用,您将遇到内存泄漏。对 ActivatedRoute 的订阅。 params 将保持对幻像组件的引用,尽管不会产生新值
  • @Liero 正确,我说错了。但是这里的答案说我们需要管理对从ActivatedRoute.params 返回的 observable 的任何订阅。我指出这是不正确的,如链接文档中所述。通过长期运行的对象保持对ActivatedRoute 的引用而引入内存泄漏是一个完全不同的问题,与可观察订阅的管理无关。
  • 啊,这个澄清有帮助。你是对的。我会想一个新的例子。 @KevinBabcock
【解决方案2】:

一个 Observable 可以有两种行为:

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

b) 当订阅者订阅它时,订阅者会连续接收数据(当数据流发生变化时)。对于接收新数据,您无需再次订阅 observable。

在 a) 的情况下,我们谈论的是 COLD Observervable;

在情况 b) 中,我们谈论的是 HOT Observervable;

check this article

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多