在组件构造函数中订阅@Output EventEmitter,不取消订阅是否安全?
关于组件构造函数订阅@Output EventEmitter不取消订阅的安全性
你的直觉是正确的,这种场景下不手动取消订阅是安全的,不会造成内存泄漏,原因如下:
- @Output EventEmitter的生命周期绑定组件实例:
@Output装饰的EventEmitter是组件实例的成员属性,当组件被Angular销毁时,组件实例会被标记为垃圾回收,依附于它的EventEmitter也会随之被回收,其关联的所有订阅会被自动清理,不会残留引用导致内存泄漏。 - 区别于长期存在的Observable:如果订阅的是来自全局服务的长期Observable(比如一直监听后端推送的数据流),组件销毁后若不取消订阅,订阅会依附于服务的Observable继续存在,才会引发内存泄漏。但@Output的EventEmitter只服务于当前组件的父子通信,组件销毁后它就失去了存在的意义,没有外部引用会保留它。
举个简单的代码示例:
@Component({ selector: 'app-child', template: '' }) export class ChildComponent { @Output() myEvent = new EventEmitter<string>(); constructor() { // 构造函数中订阅自身的@Output EventEmitter this.myEvent.subscribe(value => { console.log('收到事件:', value); }); } }
当这个ChildComponent实例被销毁时,myEvent这个EventEmitter会和组件实例一起被回收,上面的订阅也会被自动终止,不会留下内存泄漏隐患。
内容的提问来源于stack exchange,提问作者Ofek Ron
相关产品推荐
相关产品推荐

