如果没有“ Subscription”类型的对象,如何从Observable退订?

时间:2018-08-10 15:08:20

标签: angular typescript observable subscription

如果我订阅了一个Observable,如果没有“ Subscription”类型的对象,该如何取消订阅?

如果我有类似的东西:

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 个答案:

答案 0 :(得分:2)

您实际上在这里提供了自己的答案:bla ...是您的this.isLoggedIn$.subscribe( ... )电话。

ngOnInit() {

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

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

}

答案 1 :(得分:2)

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

  1. 您可以将上述方法用作this.subscription来分配订阅 为每个订阅,然后明确取消每个订阅。 (它 应该避免)

  2. 您可以通过以下示例使用takWhile管道 下方:

    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;
    }
    
  3. 使用takeUntil运算符:

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

我希望这会有所帮助!

答案 2 :(得分:1)

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

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