当前位置: 首页 > 知识库问答 >
问题:

我是否应该退订根角分量中的可观测数据?

冷英博
2023-03-14

我的根(引导)Angular(6.x)组件AppComponent中有一个可观察到的组件。
通常,在使用生命周期钩子ngOnDestroy调用destroy()时,我会取消订阅任何打开的订阅。
由于AppComponent是应用程序的根,因此从不被销毁(除非整个应用程序被销毁),我是否还需要实现ngOnDestroy以及是否需要费心取消订阅?

我一直没能找到这个看似常见的确切情况的答案。

示例:

export class AppComponent implements OnInit, OnDestroy {
  private tokenSubscription: Subscription;
  constructor(private dataSvc: DataService) { }
  ngOnInit() {
    this.tokenSubscription = this.dataSvc.myObservable.subscribe((val) => {
      // do stuff
    });
  }
  ngOnDestroy() {
    this.tokenSubscription.unsubscribe(); // Do I need this in root component?
  }
}

谢谢!

共有1个答案

黄正浩
2023-03-14

AngularAppComponent中的RXJS订阅不需要取消,只要不重复创建新的订阅。例如,如果订阅是在AppComponentngoninit中创建的,只要它们是一次性操作,就可以。

对于根组件中创建的Angular服务,理想的做法是使用singleton服务,以确保App中只存在一个实例。

虽然根组件中的订阅没有取消订阅通常是可以的,但建议遵循管理订阅的最佳实践。

    null
constructor(private dataSvc: DataService) { }

ngOnInit() {
  this.dataSvc.myObservable.pipe(take(1)).subscribe((val) => {
    // do stuff
  });
}

查看在Angular应用程序中退订RxJS可观测数据的最佳方法!

 类似资料:
  • 令人惊讶的是,很难得到一个关于你是否应该以及何时取消订阅角度观测的直接答案。 我有以下情况: 我看到了一些解决方案: > 将订阅存储为变量,并在Ngondestory中取消订阅 什么都不做,我会帮你把所有的退订资料整理出来 我知道有第三方库,比如,但是假设我们没有任何第三方库,这是建议的退订方法?

  • 我必须从两个订阅服务器获取数据,但我总是获取第一个订阅服务器的数据。 我有一个数据共享服务: 在离开搜索组件之前,我调用update方法。 现在,我在results组件上。我得到的共享数据如下: 我的问题是:我需要共享数据来订阅另一个可观察的数据。首先,我构造了一个物体乘坐,在我调用搜索方法之后 问题是我总是从数据服务获取数据,而不是从api调用。api工作导致我在存储中拦截结果,而不是在组件中。

  • 我有一个Angular组件,将observable(BehaviourSubject)设置为类成员 有时我会订阅它 问题是:我是否应该在ngOnDestroy()中取消订阅 尚不清楚,因为可观察的生命周期似乎与组件的生命周期相同,可能我们不应该关心内存泄漏。 示例代码:

  • 让我们考虑下面的示例代码: 在函数gude()中,将创建一个新的observable,它将发出哈希值,该哈希值的前n个前导值设置为零。一个观察者订阅了那个可观察的,并立即取消订阅。让我们假设函数createHashWithNLeadingZeroes()需要相当长的时间来生成响应。 我想这里发生了以下事情: (1) 创建了一个新的可观察对象,描述可观察对象行为的函数被内部存储在属性_subscri

  • 我正在创建一个应用程序,希望用户打开他们的活动聊天。它由Firebase作为后端提供动力。但是,在从第一个可观察订阅中检索数据(我需要将其用作第二个可观察订阅中的参数)之后,第二个订阅不会返回任何数据:它是空的。 在第一个订阅中,我检索一个唯一的ChatID。对于第二次订阅,我希望使用此ChatID接收Firebase集合中的所有邮件。 我已经发现它与观测对象的异步风格有关,但是我不知道如何嵌套观

  • 我有一个沙盒,它订阅了一个消息流,我想过滤该流,以查找已发送到或从特定用户使用另一个组件中指定的路由参数接收的消息。 messages.sandbox.ts: messages.detail.container.ts this.matching消息$似乎只包括this.received消息$但是我知道this.sent消息$不是空,因为我可以在我的模板中使用它没有问题。 我是不是遗漏了一些合并观测