【问题标题】:How does Angular store an observable not linked to a variable?Angular 如何存储未链接到变量的可观察对象?
【发布时间】:2021-07-12 22:46:48
【问题描述】:

想象一下,我在ngOnInit() 钩子中写了一个可观察的表达式,如下所示:

ngOnInint(){
  this.httpClient.get('request-url').subscribe(response => {
      ...
    })
}

ngOnInit 执行之后,如果函数的上下文没有保存到变量中,它可能会被破坏。但即使 observable 仍然由任何值 emit 处理。

问题是:如果未将 observable 保存到变量中,angular 将在何处以及如何跟踪它?

【问题讨论】:

  • 不是angular独有的特性,而是rxjs的精髓。这篇文章去年帮助了我 - kgotgit.medium.com/…

标签: javascript angular rxjs


【解决方案1】:

即使没有变量,实际上也会创建订阅,并且浏览器会为其分配内存。当然,订阅是引用可观察/主题。即使组件从页面中删除,订阅仍然存在并导致内存泄漏,因为garbage collector 不会删除它。这就是 javascript 的工作原理,它不是 Angular 或 rxjs 的问题。

GC算法根据各种条件决定删除对象。例如,如果此对象对其他资源的引用为零,并且没有其他对象对这个对象的引用。

这就是为什么当您不再需要订阅时应该取消订阅 observables。在后台,当您调用 unsubscribe 时,Rxjs 会清理可观察引用,这会导致两件事:不再处理进一步的值发出,并且 GC 将能够在最近的时间释放内存。

在 Angular 中,最佳做法是在 ngOnDestroy 中执行此操作:

ngOnInit() {
  this.subscription = this.httpClient.get('request-url').subscribe(...)
}

ngOnDestroy() {
  this.subscription.unsubscribe();
}

当然,为了做到这一点,您需要将订阅分配给一个变量,因为否则您将无法调用unsubscribe 方法。

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 2021-12-30
    • 2016-04-24
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2018-10-05
    • 2020-12-25
    相关资源
    最近更新 更多