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

Posted

技术标签:

【中文标题】ReactiveX JS 和 TypeScript - 如何取消订阅?【英文标题】:ReactiveX JS and TypeScript - How to unsubscribe? 【发布时间】:2016-12-14 04:36:11 【问题描述】:

我一直在尝试使用 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();
      

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

【问题讨论】:

【参考方案1】:

您需要将 unsubscribe 方法添加到您的 Observable.、Disposing Observable Executions

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

  return () => 
    console.log('unsubscribe')
  
); 

【讨论】:

我们可以在 Angular 8 中也这样做吗?【参考方案2】:

首先创建订阅如下。

private obs: Subscription = new Subscription();

然后赋值给 observable。

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

【讨论】:

【参考方案3】:

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

事实上,您取消订阅的是订阅而不是 observable。

【讨论】:

以上是关于ReactiveX JS 和 TypeScript - 如何取消订阅?的主要内容,如果未能解决你的问题,请参考以下文章

RxJava 学习资料——ReactiveX和RxJava

转载ReactiveX 的理念和特点

原创ReactiveX之基础思路被观察者和观察者 (RxJava为例子)

Reactive-Extensions / RxJS和ReactiveX / rxjs之间有什么区别

关于使用 swift 进行 ReactiveX 编程的查询 [关闭]

ReactiveX序列——RxSwift