由于内存泄漏而取消订阅可观察的对象

时间:2018-10-19 06:32:01

标签: angular rxjs observable

我有一个后端服务,当我们使用HTTP服务到达其端点之一时,该服务将返回一些数据。现在,在角度模式下,我们正在使用Observables。我们subscribe到达终点。像这样

constructor(private http : Http){
}

ngOnInit(){
   this.http.get('/api/posts').subscribe(response => {
      // Store data into class variable
   })
}

订阅后。在订阅的next部分中。无论响应如何,我们都会获得所有数据。现在,除了收到的数据之外,没有什么别的东西了,但是仍然有很多人说,如果我们不取消订阅,就会出现内存泄漏。我们通常以ngOnDestroy()生命周期方法退订。我真正想知道的是,当调用已完成时,我们已经通过响应从服务器获取了数据,没有更多可利用的了。那为什么我们需要unsubscribe呢?我想特别了解一下内存泄漏的概念。

2 个答案:

答案 0 :(得分:6)

TL; DR; ,不需要取消订阅http呼叫。

除非可观察对象完成,否则您应该始终考虑取消订阅可观察对象,对于http调用可观察对象就是这种情况。

有许多退订方法,如果只需要一个结果,则可以添加obs.pipe(first()),该结果将在收到第一个结果后自动完成。您还可以使用async直角管道,该管道在组件销毁时会自动订阅和取消订阅。

答案 1 :(得分:1)

当您调用订阅时,它会释放javascript中的订阅,以为我们提供http调用事件回调的句柄 允许我们取消正在进行的http呼叫。 由于在这种情况下,您没有将其保留在变量中,因此它会以匿名方式保留在javascript内存中,因为将来的事件/处理程序假定webservice需要花费时间执行它并没有返回,但是订阅仍保留在组件中,并且存在角度错误,该错误不会自动取消订阅这些电话,则该订阅仍会在javascript捆绑包中徘徊。 有关更多参考

https://github.com/angular/angular/issues/16261