【发布时间】:2018-09-18 16:07:01
【问题描述】:
我的 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()方法中完成,但是如何取消订阅不是这里讨论的重点)
【问题讨论】:
-
因为订阅是独立于组件的,这就是unsubscribe存在的原因
-
订阅独立于组件,这就是取消订阅存在的原因,是的,这很明显。但是,这是如何工作的?订阅保存在哪里?为什么在组件销毁时保留它?
-
它保存在内存中,因此得名内存泄漏。
-
订阅就像一个独立的线程。它不依赖于组件。组件只有一个参考。您只能使用 ngOnDestroy() { this.subscription.unsubscribe(); 销毁}