首页 文章

ReactiveX JS和TypeScript - 如何取消订阅?

提问于
浏览
2

我一直在尝试使用TypeScript在Angular 2组件中实现新的rxjs Observable . 我创建了一个服务 MyService ,它在一个方法中返回一个observable,例如,

export class MyService {

    getMyObs(){
        return new Observable(observer => {
            observer.next(42);
        });
    }
}

然后在我的Angular 2组件中,我在OnInit中订阅了这个observable,例如,

export class MyComponent implements OnInit {
obs: any;

constructor(private myService: MyService){};    

    ngOnInit {
        this.obs = myService.getMyObs().subscribe(data => {
            // Do stuff here...
        });
    }    
}

RxJs documentation谈论取消订阅你的observable,以便你的observable知道不再向你的观察者发出消息 . 因此,我认为当我的组件被破坏时,我应该取消订阅observable,例如

export class MyComponent implements OnInit, OnDestroy {
obs: any;

constructor(private myService: MyService){};    

    ngOnInit {
        this.obs = myService.getMyObs().subscribe(data => {
            // Do stuff here...
        });
    } 

    ngOnDestroy {
        this.obs.unsubscribe();
    }  
}

虽然这对我有意义,但是打字稿编译器会抛出(实际上应用程序抛出),说没有 unsubscribe 方法 . 似乎在类型定义文件中没有描述这样的方法 . 如何使用TypeScript正确取消订阅observable?

3 回答

  • 0

    您需要为您的 Observable 添加取消订阅方法 . ,Disposing Observable Executions

    return new Observable(observer => {
      observer.next(42);
    
      return () => {
        console.log('unsubscribe')
      }
    });
    
  • 0

    您可以在Rxjs模块的 Subscription.d.ts (类 Subscription )中找到 unsubscribe 方法的定义 .

    事实上,您取消订阅订阅而不是可观察订阅 .

  • 3

    首先创建订阅如下 .

    private obs: Subscription = new Subscription();
    

    然后分配给observable .

    this.obs = myService.getMyObs().subscribe(data => {
           if(data !== null){
            this.obs.unsubscribe()
             }
        });
    

相关问题