取消订阅服务内的 Observables?

Mic*_*ael 5 subscriptions unsubscribe observable typescript angular

在查看代码示例时,我经常看到服务内部的可观察对象未被取消订阅的情况。

这是一个例子:

export class AuthGuard implements CanActivate {

    private isLoggedIn: boolean;
    private isLoggedIn$: Observable<boolean>;


    constructor(private authService: AuthService, private router: Router) {
        this.isLoggedIn$ = this.authService.isLoggedIn();

        this.isLoggedIn$.subscribe(res => {
            if (res) {
                this.isLoggedIn = true;
            } 
            else {
                this.isLoggedIn = false;
            }
        });
    }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        if (this.isLoggedIn) {
            return true;
        }
        else {
            this.router.navigate(['login']);
            return false;
        }     
    }
} 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您是否有理由不取消订阅可观察的 this.isLoggedIn$ ?或者上面的例子只是错误的编码导致内存泄漏?

Rea*_*lar 0

在查看代码示例时,我经常看到服务内部的可观察对象未被取消订阅的情况。

您正在查看一个错误。

在这种情况下,您是否有理由不取消订阅可观察的 this.isLoggedIn$ ?

如果你想泄漏内存。

或者上面的例子只是错误的编码导致内存泄漏?

是的,它正在泄漏内存。subscribe 函数会在所引用的对象被销毁后继续执行this。如果这个对象永远不会被销毁,那么这种情况可能永远不会发生,但它是一个在临时创建对象的单元测试中会失败的代码示例。

标记为 的对象@Injectable()通常表现得像单例或具有弱引用。它可能会工作一段时间,但是一旦你在临时情况下使用它,它就会泄漏内存。