2017-09-26 78 views

回答

0

您取消订阅组件,因为当您从DOM中删除它们(例如,使用*ngIf或其他)时,RxJS链将持有对您在那里创建的观察者的引用。因此引入内存泄漏。

一般而言,您不必在服务中取消订阅,因为它们在应用程序的整个生命周期中都存在。

但是,在Angular中,您可以创建一个组件,例如仅向其后代提供不同的服务实例(这意味着您可能在应用程序中具有相同服务类的多个实例)。在这种情况下,您应该手动取消订阅(可能在销毁定义它们的组件时)。

+0

简而言之,我们可以设定一个规则:每当订阅应该比**无限**'Observable'短时,我们必须在任何**情况下取消订阅。组件/指令中的订阅只是最常见的情况。这是真的吗? –

+0

@AlexanderAbakumov是的,这基本上是我遵循的规则。 – martin

1

我认为重要的是要解释为什么取消订阅是重要的。没有必要从流中取消订阅,但性能可能有优势,在某些情况下,取消订阅作为功能的一部分非常重要。

说取消订阅是消费者的责任也很重要。流“强制”消费者退订的唯一方法是完成或错误。

在Angular服务中,如果您最终订阅了一个流,取消订阅是很好的做法,除非您有充分的理由继续倾听。下面是一个(人为的)例子:

import { Injectable } from '@angular/core'; 
import { Observable } from 'rxjs'; 

@Injectable() 
export class MyService { 
    constructor(private session: Session) { } 

    isLoggedIn(): Observable<boolean> { 

    return Observable.create(observer => { 
     const innerSubscription = this.session.subscribe(session => { 
     if (session.user.isLoggedIn) { 
      observer.next(true); 
     } 
     observer.next(false); 
     }); 

     return function unsubscribe() { 
     innerSubscription.unsubscribe(); // this "cleans up" our subscription. 
     }; 
    }); 

    } 
} 

还有其他更好的方法来编写这段代码,它只是一个例子。所以在这种情况下,我们有一个订阅会话的非Component/Directive。每次会话发生变化时,我们都会查看用户是否已登录,并通知我们的听众是否已登录。如果每个人都退订我们,我们仍然会收听this.session,除非我们(服务)明确退订。