subscription.unsubscribe() 和 subscription.remove() 有啥区别?

Posted

技术标签:

【中文标题】subscription.unsubscribe() 和 subscription.remove() 有啥区别?【英文标题】:What is the difference between subscription.unsubscribe() and subscription.remove()?subscription.unsubscribe() 和 subscription.remove() 有什么区别? 【发布时间】:2019-04-24 23:55:30 【问题描述】:

我正在使用 Angular 5 并使用 subscribe() 方法订阅了一个 observable。我想知道是否只在订阅上调用unsubscribe() 方法就足以清理所有内容,还是我也应该调用remove() 方法?

代码sn-p:

`

// somewhere in a method
this.s1 = someObservable.subscribe((value) => 
     //somecode
 );
// in ngOnDestroy
this.s1.unsubscribe(); // should I also call .remove()

`

【问题讨论】:

【参考方案1】:

.remove 从内部列表中删除订阅,但它不会取消订阅。

.unsubscribe 清理所有内容,取消订阅并从内部列表中删除观察者。 (有一个错误(已修复)没有从列表中删除观察者)

.takeWhile保持订阅,因为某种情况是false

示例:

this.service.method()
.subscribe(res => 
  //logic
);

这将永远不会取消订阅。

this.service.method()
    takeWhile(() => this.isAlive) // <-- custom variable setted to true
    .subscribe(res => 
      //logic
    );

ngOnDestroy()
    this.isAlive = false;

组件即将被销毁时自动取消订阅。

   this.s1 = someObservable.subscribe((value) => 
        //somecode
    );

public yourMethod()
    this.s1.unsubscribe();

此订阅将存在并“有效”,直到未调用 yourFunction

--

我个人喜欢使用 rxjs 操作符takeWhile 来保持代码整洁。在一个非常大的项目或具有多个订阅的单个组件中,使用 (IE) 30 variables: Subscription 会让人感到困惑。因此,如果您问何时使用 takeWhile 运算符,我的答案是:(以订阅为例)-> 如果您确定在销毁组件时需要完成 unsubscribe,请使用 takeWhile。如果您需要在组件仍然“活动”的特定场景下取消订阅,请使用我编写的第二个示例。

希望已经澄清了这个论点。

【讨论】:

以上是关于subscription.unsubscribe() 和 subscription.remove() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章