想象一下,我在ngOnInit()
钩子中写了一个可观察的表达式,如下所示:
ngOnInint(){
this.httpClient.get('request-url').subscribe(response => {
...
})
}
在ngOnInit
执行之后,如果函数的上下文没有保存到变量中,则可能会被破坏。但是,即使可观察到的仍然由任何值来处理。
问题是:如果不将可观测值保存为变量,angular在哪里以及如何跟踪可观测值?
即使没有变量,订阅实际上也是创建的,浏览器会为其分配内存。当然,订阅引用的是observatory/subject。即使从页面中删除了组件,订阅仍然存在,并导致内存泄漏,因为垃圾收集器不会删除它。这就是javascript的工作原理,它不是Angular或rxjs的问题。
GC算法根据各种条件决定移除对象。例如,如果此对象对其他资源的引用为零,并且没有其他对象对此资源的引用。
这就是为什么当你不再需要订阅时,你应该取消订阅observables。在后台,当您调用unsubscribe
时,Rxjs会清理可观察的引用,这会导致两件事:不再处理进一步的值发射,GC将能够在最近的时间内释放内存。
在Angular中,最佳实践是在ngOnDestroy
:中这样做
ngOnInit() {
this.subscription = this.httpClient.get('request-url').subscribe(...)
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
当然,为了做到这一点,您需要将订阅分配给一个变量,因为在其他方面,您将无法调用unsubscribe
方法。