我应该取消订阅Cold Observable吗?

Ste*_*rov 5 rxjs angular

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

但如果它是Cold Observable,我还应该取消订阅吗?

例如,返回的一个 Http.get()

Vol*_*hat 8

你不需要这样做。HTTP 可观察对象在操作完成后立即调用完成。

从源代码来源我可以看到它unsubscribe在错误和完成时被调用。

protected _error(err: any): void {
    this.destination.error(err);
    this.unsubscribe();
}

protected _complete(): void {
    this.destination.complete();
    this.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud)

我进一步做了一个小实验,添加unsubscribe了超时

var subscription = this.http.get(`apiurl`)
            .subscribe(response => {
                setTimeout(function(){ 
                    debugger;
                    subscription.unsubscribe(); }, 30);
            });
Run Code Online (Sandbox Code Playgroud)

如果我走进unsubscribe

 Subscriber.prototype.unsubscribe = function () {
        if (this.closed) { // this.closed is true
            return;
        }
        this.isStopped = true;
        _super.prototype.unsubscribe.call(this);
    };
Run Code Online (Sandbox Code Playgroud)

then this.closed == true,这意味着unsubscribe之前被调用过。

所以是的,现在我可以肯定地说您不需要取消订阅:)


小智 6

由于冷可观察量是有限的,您不必取消订阅。

在以下情况下取消订阅:

  • 无限可观测,例如。间隔()
  • 如果订阅(Subject、BehaviourSubject、ReplaySubject、AsyncSubject)

对于 ReplaySubject,如果未提供缓存生命周期,您应该取消订阅

对于 AsyncSubject,如果未完成,您应该取消订阅

  • Websocket流
  • 抽象控制前。值更改()
  • Renderer2.listen()
  • 事件流例如。表单事件()
  • NGRx 商店

在以下情况下请勿取消订阅:

  • 如果流正在结束自己前。of('1','2')
  • 路由器事件,来自路由器的所有可观察对象都会自行取消订阅
  • 异步管道
  • 有限可观察例如。http.get()
  • 事件发射器

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

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