提问者:小点点

如果没有“订阅”类型的对象,如何取消订阅可观察?


如果我订阅了可观察对象,如果没有“订阅”类型的对象,我如何取消订阅?

如果我有类似的东西:

this.subscription = bla ... 

然后我可以按如下方式取消订阅它(在ngOnDestroy()-方法中):

this.subscription.unsubscribe();

但是如果我有这样的东西呢:

 ngOnInit() {

    this.isLoggedIn$ = this.authService.isLoggedIn();

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

  }

我如何取消订阅?我甚至必须取消订阅吗?如果没有,为什么不呢?


共3个答案

匿名用户

有3种方法可以取消订阅可观察的

>

  • 您可以使用上述方法作为this.订阅为每个订阅分配订阅,然后显式取消订阅。(应该避免)

    您可以使用以下示例使用tak同时管道:

    private isAlive = true;
    
    ngOnInit() {
    
      this.isLoggedIn$ = this.authService.isLoggedIn();
    
      this.subscription = this.isLoggedIn$
       .pipe(takeWhile(() => this.alive))
       .subscribe(res => {
        if (res) {
          this.isLoggedIn = true;
        } 
        else {
          this.isLoggedIn = false;
        }
      });
    
    }
    
    
    ngOnDestroy() {
       console.log('[takeWhile] ngOnDestory');
       this.alive = false;
    }
    

    使用取值运算符:

    private unsubscribe: Subject<void> = new Subject();
    
    ngOnInit() {
    
      this.isLoggedIn$ = this.authService.isLoggedIn();
    
      this.subscription = this.isLoggedIn$
       .pipe(takeUntil(this.unsubscribe))
       .subscribe(res => {
        if (res) {
          this.isLoggedIn = true;
        } 
        else {
          this.isLoggedIn = false;
        }
      });
    }
    
    ngOnDestroy() {
      this.unsubscribe.next();
      this.unsubscribe.complete();
    }
    

    我希望这有帮助!!

  • 匿名用户

    您实际上已经在这里提供了自己的答案:bla…是您的this. isLoggedIn$.订阅(…)调用。

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

    匿名用户

    退订前检查this. isLoggedIn$是否存在

    ngOnDestroy() {
    this.isLoggedIn$ && this.isLoggedIn$.unsubscribe();
    }