【问题标题】:Unsubscribing within Angular Singleton Services?在 Angular 单例服务中取消订阅?
【发布时间】:2020-05-02 13:58:42
【问题描述】:

如果我们有一个带有构造函数注入的 @injectable 单例服务,其工作方式如下:

constructor(private ds:DataService) {

   ds.obervable$.subscribe(data=>...)

}

我们需要退订吗?好像我们没有,因为它是一个单例服务,而且我们在这种情况下只创建一个订阅,当服务被销毁时,它会被销毁,也就是应用程序关闭的时候。

我想对了吗?

【问题讨论】:

标签: javascript angular typescript rxjs


【解决方案1】:

服务被销毁时它不会被销毁。必须手动进行,服务上没有OnDestroy钩子之类的东西。但是,这通常没问题,因为当应用程序打开时,单例总是存在的。您需要取消订阅的唯一情况是您不再需要该服务(例如:将提供者替换为同一提供者的另一个对象)。

【讨论】:

  • 一个服务可以有ngOnDestroySO answerLive demo
  • 这就是我的想法。该服务是单例。当它订阅时,它只会创建一个订阅。当应用程序关闭时,该订阅会被销毁。所以真的没有必要取消订阅。我错过了什么吗?我想我们说的是同一件事。无需取消订阅单例服务....假设它们只会在应用程序中创建一次。
  • 服务可以实现OnDestroy并调用hook。
【解决方案2】:

我认为在服务的生命周期和订阅由该服务返回的 observable 的生命周期之间存在一些混淆。

虽然确实,如果我们只订阅一次 observable,那么只会有一个订阅,但这与服务是否为单例无关。订阅不属于服务,属于服务的消费者。

但是,将订阅的生命周期视为与服务的生命周期相关联是不正确的。它们有完全独立的生命周期。

当应用程序关闭时,两者都将被销毁,但这只是因为它们都是该应用程序的一部分。

【讨论】:

  • 您能详细说明一下incorrect to consider the lifetime of the subscription as tied to the lifetime of the service 吗?我相信当服务是单例时(正如您已经提到的),但当服务未在根级别(例如在 comp 级别)提供时,如果订阅在 serv.被摧毁,一个人可能会遇到内存。泄漏。这些实体不是以某种方式联系在一起的吗?
  • 在我提供的上下文中(我的意思是非常严格的上下文)服务的构造函数只会创建一个订阅。剩下的假设是服务在应用程序的整个生命周期内都存在。当应用程序关闭时,服务被销毁,订阅也是如此。所以退订它是多余的。我错过了什么吗?
  • 您没有解释您在服务内订阅的问题,但这没关系,因为您没有在该服务或其他任何地方保存对该订阅的引用。因此,我所说的仍然适用。但是,您应该更具体地表达您的问题
猜你喜欢
  • 1970-01-01
  • 2018-10-19
  • 2018-07-21
  • 1970-01-01
  • 2023-01-04
  • 2020-10-26
  • 2019-11-25
  • 2018-04-19
  • 2021-11-18
相关资源
最近更新 更多