没有 ngOnDestroy,角度取消订阅不起作用

Posted

技术标签:

【中文标题】没有 ngOnDestroy,角度取消订阅不起作用【英文标题】:angular unsubscribe does not work without ngOnDestroy 【发布时间】:2019-02-04 17:49:34 【问题描述】:

如果在公共方法而不是 ngOnDestroy 中使用,则无法取消订阅。

如果有用于轮询 API 的 rxjs 可观察间隔。 onNgInit 我订阅该 observable 如下:

Class .. 
   pollingSubscription: Subscription;

  ngOnInit() 
      startPolling();
   

  // when this gets triggered my polling subscription stops
  ngOnDestroy() 
      if (this.pollingSubscribe) 
          this.pollingSubscription.unsubscribe();
      
  

   startPolling() 
      const pollingInterval: Observable<any> = observable.interval(3000).startWith(0);
      this.pollingSubscription = pollingInterval.subscribe( _ => 
         this.store.dispatch(// trigger my Action);
      );
   

   // when this gets triggered on a click event my polling subscription still keeps polling.
   stopPolling() 
       if ( // condition true) 
           // on this condition stop polling, FYI this line does get triggered,
           // but there is no effect, it still keeps subscribed.
           this.pollingSubscription.unsubscribe();
       
   

在公共函数 stopPolling() 中我做错了什么吗? 如何在给定组件上仍处于活动状态的情况下取消订阅。

谢谢。

【问题讨论】:

你在哪里对 stopPolling() 进行函数调用? 只是一个例子,它可以在任何地方调用,比如点击事件。 我问是因为我没有看到取消订阅的功能调用。 @patz 你确定条件是真的吗?代码没有问题,应该可以取消订阅 好吧,我不确定你的代码有什么不同,但我已经在 StackBlitz 上对其进行了重构,找不到任何问题:stackblitz.com/edit/… 【参考方案1】:

你的class 使用了implements OnInit, OnDestroy 吗?可能是如果您的类没有使用OnDestroy 实现,那么ngOnDestroy() 将不会被执行。这是the official link 为OnDestroy

下面的 sn-p 展示了组件如何实现这个接口来定义自己的自定义清理方法。

@Component(selector: 'my-cmp', template: `...`)
class MyComponent implements OnDestroy 
    ngOnDestroy() 
       // ...
    

【讨论】:

以上是关于没有 ngOnDestroy,角度取消订阅不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 takeUntil 和 combineLatest 取消订阅可观察的 rxjs 不起作用

组件 ngOnInit 中的 Angular 订阅

取消订阅按钮后表单的 EventListener 不起作用

取消订阅一系列订阅

服务中的 Angular 4+ ngOnDestroy() - 销毁 observable

如何删除/更新异步方式以及何时取消订阅?