在查看代码示例时,我经常看到服务内部的 observable 没有取消订阅的情况。

下面是一个例子:

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;
        }
    }
}

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

最佳答案



您正在查看一个错误。



如果你想泄漏内存。



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

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

关于angular - 取消订阅服务内部的 Observables?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51791041/

10-12 17:58