Subject和Subscription类中的unsubscribe()方法有什么区别?

时间:2019-12-17 10:06:54

标签: angular rxjs

我在Subject类上使用subscribe()方法订阅了Subject。要取消订阅,我看到两个选项,因为unsubscribe()Subject类都可以使用Subscription方法。

  1. 使用Subscription方法返回的subject.subscribe()
ngOnInit() {
  this.subscription = this.subject.subscribe(next => nextHandler(), err => errHandler()); 
}

ngDestroy() {
  this.subscription.unsubscribe();
}
  1. 直接在主题上调用unsubscribe()方法,例如subject.unsubscribe()
ngOnInit() {
  this.subject.subscribe(next => nextHandler(), err => errHandler()); 
}

ngDestroy() {
  this.subject.unsubscribe();
}

退订的正确方法是什么。

2 个答案:

答案 0 :(得分:2)

我知道的唯一区别是,在使用MyService时,它不会触发管道运算符创建的任何处置处理程序。

Subject.unsubscribe()

这将永远不会将import { Subject } from 'rxjs'; import { finalize } from 'rxjs/operators'; const subject = new Subject(); const subscription = subject .pipe( finalize(() => console.log('done')), ) .subscribe(); subject.unsubscribe(); // subscription.unsubscribe(); 打印到控制台,因为done仅删除所有观察者。 https://github.com/ReactiveX/rxjs/blob/master/src/internal/Subject.ts#L105

使用Subject.unsubscribe()时将触发subscription.unsubscribe()的处理程序,这可能是更可预测的行为。

实时演示:https://stackblitz.com/edit/rxjs-z5fjh1

答案 1 :(得分:1)

将主题设为新闻纸,它将每天向您发送一系列事件,并且订阅与用户订阅有关。

Subject.unsubscribe() 当您这样做时,您实际上是要销毁报纸本身,因此您不应该这样做。 Subscription.unsubscribe() 当您执行此操作时,您只是取消订阅您已订阅的订阅。不是来源(主题)。

请参见下面的演示: https://stackblitz.com/edit/typescript-umf1tv