我应该取消订阅Cold Observable吗?

时间:2017-02-02 11:03:56

标签: angular rxjs

我知道从Observable 取消订阅以防止内存泄漏是一种很好的做法。

但如果冷可观察我还应该取消订阅吗?

例如Http.get()

返回的一个

3 个答案:

答案 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)

  

由于冷观测值有限,因此您不必取消订阅。

何时取消订阅:

  • 无限可观察物,例如。 interval()
  • 如果已订阅(主题,行为主题,重放主题,异步主题)
  

对于ReplaySubject,如果未提供其缓存寿命,则应退订

     

对于AsyncSubject,如果尚未完成,则应退订

  • Websocket流
  • 抽象控件,例如。 valueChanges()
  • Renderer2.listen()
  • 事件流ex。 formEvent()
  • NgRx商店

在以下情况下请勿退订:

  • 如果流正在结束自己,例如ex。的('1','2')
  • 路由器事件,路由器中的所有可观测对象都自行取消订阅
  • AsyncPipe
  • 有限可观察的ex。 http.get()
  • EventEmmiter

如果订阅无法完成或出现错误,则必须取消订阅。

如果我错了或缺少什么,请告诉我。 谢谢;)