我有一个后端服务,当我们使用HTTP
服务到达其端点之一时,该服务将返回一些数据。现在,在角度模式下,我们正在使用Observables
。我们subscribe
到达终点。像这样
constructor(private http : Http){
}
ngOnInit(){
this.http.get('/api/posts').subscribe(response => {
// Store data into class variable
})
}
订阅后。在订阅的next
部分中。无论响应如何,我们都会获得所有数据。现在,除了收到的数据之外,没有什么别的东西了,但是仍然有很多人说,如果我们不取消订阅,就会出现内存泄漏。我们通常以ngOnDestroy()
生命周期方法退订。我真正想知道的是,当调用已完成时,我们已经通过响应从服务器获取了数据,没有更多可利用的了。那为什么我们需要unsubscribe
呢?我想特别了解一下内存泄漏的概念。
答案 0 :(得分:6)
TL; DR; ,不需要取消订阅http呼叫。
除非可观察对象完成,否则您应该始终考虑取消订阅可观察对象,对于http调用可观察对象就是这种情况。
有许多退订方法,如果只需要一个结果,则可以添加obs.pipe(first())
,该结果将在收到第一个结果后自动完成。您还可以使用async
直角管道,该管道在组件销毁时会自动订阅和取消订阅。
答案 1 :(得分:1)
当您调用订阅时,它会释放javascript中的订阅,以为我们提供http调用事件回调的句柄 允许我们取消正在进行的http呼叫。 由于在这种情况下,您没有将其保留在变量中,因此它会以匿名方式保留在javascript内存中,因为将来的事件/处理程序假定webservice需要花费时间执行它并没有返回,但是订阅仍保留在组件中,并且存在角度错误,该错误不会自动取消订阅这些电话,则该订阅仍会在javascript捆绑包中徘徊。 有关更多参考