我正面临一个问题,因为:: 未捕获的类型错误:无法读取未定义的属性'unsubscribe'。我在网上应用了很多修复,但仍无法摆脱在调试代码期间,我还在控制台中记录了对象。订阅对象可用且未处于关闭状态,但当它到达ngdestroy()方法时,它会被取消定义。请帮助我。我的代码是:
初始化:
downloadSubscription: Subscription= new Subscription();
uploadSubscription: Subscription= new Subscription();
分配Observable:
this.uploadSubscription = this._apiService.uploadFile(jsonData).subscribe(response => {
this.showAlertMessage(true, 'success', response.RESPONSE);
}, Error => {
console.log('ErrorMessage:' + Error +
' Current Request' + JSON.stringify(this.Upload.filename) + 'File At Post Method.');
this.showAlertMessage(true, 'error', 'Unable to upload File.Please try again.');
});
NGDestroy方法
ngOnDestroy() {
console.log('unsubscribing observables');
// unsubscribing to prevent memory leaks.
this.uploadSubscription.unsubscribe(); }
答案 0 :(得分:0)
我发现因为我在我的服务中使用HttpClient模块,所以实际上没有必要取消订阅observable。
注意事项:
1)有两组Observable:有限和无限
2)Http本质上肯定会得到一个响应,因此将是有限的。
3)即使目标被摧毁,我们也会取消订阅以释放保留的堆积内存。
根据我的理解,以下是 http请求的可观察生命周期的简要说明:
1)组件将启动订阅对象
2)然后它将有一个catch订阅者Object,它将触发Observable。
3)最后将触发HTTP调用,这里我们有两种情况:
a) User stays with in the component :
In this case there is no need to unsubscribe ,because request will be completed and Observable will be cleaned automatically.
b) User Navigates to different page :
In this case the target aka component gets destroyed ,but still the Observable will live till it gets a response .Once a response is received Observable will be cleaned automatically.
因此浏览器中没有保留内存泄漏。这里需要注意的一点是,在我的情况下,因为我正在下载一个重文件,所以会发生临时内存峰值,这对目标被破坏无效,但最终会在Observable完成后自行清理。