无法取消订阅角度4 ngdestroy中的初始化observable

时间:2017-11-08 15:40:43

标签: angular observable

我正面临一个问题,因为:: 未捕获的类型错误:无法读取未定义的属性'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();  }

Attaching debug object as image

1 个答案:

答案 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完成后自行清理。