为什么订阅在组件销毁后仍然存在?

时间:2018-04-09 09:39:32

标签: angular rxjs

我的Angular应用程序有很多组件,一个是MyComponent,其组件类如下所示:

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/interval';

@Component({
  selector: 'app-my',
  templateUrl: './my.component.html',
  styleUrls: ['./my.component.scss']
})
export class MyComponent implements OnInit {
  a = 'I still alive';
  constructor() {}

  ngOnInit() {
    Observable.interval(1000).subscribe(x => console.log(this.a));
  }
}

如果我访问MyComponent,订阅将按预期启动。说,我现在离开MyComponent,现在应该销毁MyComponent。但我仍然可以看到订阅存活(控制台日志不断出现)。在主机组件(MyComponent)被销毁后允许订阅生存的实际好处是什么?

(如果我想取消订阅,我可以在MyComponent的ngOnDestroy()方法中执行此操作,但是如何取消订阅不是这里的讨论点)

2 个答案:

答案 0 :(得分:0)

在对该主题进行了一些研究之后,我发现我不需要取消订阅Angular管理的某些订阅,例如在ActivatedRoute上进行的订阅。 official guide这样说:

  

订阅组件中的可观察对象时,您几乎总是   安排在组件销毁时退订。

     

有一些不需要观察的例外观察点。   可观察到的ActivatedRoute除外。

     

ActivatedRoute及其可观察物与路由器绝缘   本身。当路由组件不再存在时,它会销毁它   需要,注入的ActivatedRoute随之死亡。

     

随时可以退订。它是无害的,永远不会坏   练习。

在我必须退订的情况下,建议使用有效的generalized approach

答案 1 :(得分:-1)

observable是RxJS的概念,与Angular生命周期无关。

截至目前,您订阅的stream of data已被订阅和监控,与Angular生命周期无关。因此,即使component被销毁,内存也会保留引用,因此我们会发生内存泄漏。

因此,我们需要明确告诉RxJSunsubscribing阶段observable destroy删除该引用。