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

4
我使用 Subject 类的 subscribe()方法订阅了一个主题。要取消订阅,我看到有两个选项,因为 unsubscribe()方法在 Subject Subscription 类中都可用。
  1. 使用由 subject.subscribe() 方法返回的 Subscription
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个回答

3

我所知道的唯一区别是,当使用 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打印到控制台,因为Subject.unsubscribe()仅删除所有观察者。https://github.com/ReactiveX/rxjs/blob/master/src/internal/Subject.ts#L105 使用subscription.unsubscribe()将触发finalize的处理程序,这可能是更可预测的行为。
实时演示:https://stackblitz.com/edit/rxjs-z5fjh1

2
假设Subject是一份新闻报纸,每天都会向您发送事件流,而订阅则与用户的订阅相关。 Subject.unsubscribe() 当您执行此操作时,实际上想要销毁报纸本身,您不应该这样做。 Subscription.unsubscribe() 当您执行此操作时,只是取消了您已经订阅的订阅,而不是源(Subject)。
请参见下面的演示: https://stackblitz.com/edit/typescript-umf1tv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接