我知道从Observable 取消订阅以防止内存泄漏是一种很好的做法。
但如果冷可观察我还应该取消订阅吗?
例如Http.get()
答案 0 :(得分:2)
你不需要这样做因为HTTP observable在动作完成后立即调用完成。
从源代码sources我可以看到在取消订阅时会在出错时和完成时调用。
protected _error(err: any): void {
this.destination.error(err);
this.unsubscribe();
}
protected _complete(): void {
this.destination.complete();
this.unsubscribe();
}
我进一步做了一个小实验,添加了取消订阅超时
var subscription = this.http.get(`apiurl`)
.subscribe(response => {
setTimeout(function(){
debugger;
subscription.unsubscribe(); }, 30);
});
如果我介入取消订阅
Subscriber.prototype.unsubscribe = function () {
if (this.closed) { // this.closed is true
return;
}
this.isStopped = true;
_super.prototype.unsubscribe.call(this);
};
然后是this.closed == true
,这意味着之前会调用取消订阅。
所以是的,现在我可以肯定地说你不需要取消订阅:)
答案 1 :(得分:0)
与其他编程语言一样,在javascript中释放已用内存绝对是最佳做法。
由于您使用的是角度2,因此可以使用 ngOnDestroy 生命周期钩子来实现,因为当组件失去其范围时会执行此方法。
假设您使用以下代码段订阅数据
subscription = this._http.getMethod('...')
.subscribe(response => this.responses = response,
error =>this.errorMessage =<any> error)
您应该使用import语句从angular / core使用导入 OnDestroy生命周期钩子。
import { OnDestroy } from '@angular/core'
在您的组件中实施 OnDestroy
export class MyComponent implements onDestroy {
.............
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
答案 2 :(得分:0)
由于冷观测值有限,因此您不必取消订阅。
对于ReplaySubject,如果未提供其缓存寿命,则应退订
对于AsyncSubject,如果尚未完成,则应退订
如果我错了或缺少什么,请告诉我。 谢谢;)