退订RxJS中的主题

时间:2018-08-17 11:56:53

标签: rxjs

我发现以下构造对我来说有些混乱(打字稿中提供了示例):

let someSubject: Subject<any> = new Subject();
let subscription1: Subscription = someSubject.subscribe((v) => {console.log(v)})
let subscription2: Subscription = someSubject.subscribe((v) => {console.log(v)})

很明显,我可以(并且应该)取消待处理的订阅,如下所示:

subscription1.unsubscribe();
subscription2.unsubscribe();

但是Subject类确实具有成员方法unsubscribe。主题既是Observable又是Observer,这与方法是一致的,但是根据我在进行以下操作时实际上并不在订阅:

someSubject.unsubscribe();

我要取消与此主题相关的所有其他订阅吗?

1 个答案:

答案 0 :(得分:0)

看来我赶紧问了一个问题。无论如何,因为我认为这没有得到很好的记录,并且如果您通过某些共享服务提供主题,可能会导致可怕的错误,下面是示例代码:

a = new Rx.Subject();

a.next(5) // No console log
s1 = a.subscribe((v) => console.log(v));
s2 = a.subscribe((v) => console.log(v*2));
a.next(5); // 5 & 10 will print out
s2.unsubscribe();
a.next(5); // 5  will print out
s2 = a.subscribe((v) => console.log(v*2)); // I can legally attach/reattach subscriber
a.next(5); // 5 & 10 will print out
a.unsubscribe(); // shut down WHOLE subject
a.next(5) // Will cause ObjectUnsubscribedError
s2 = a.subscribe((v) => console.log(v*2)) // Will cause ObjectUnsubscribedError

要点是unsubscribe不仅将关闭整个主题(使其无法发出和订阅),而且将清除所有内部观察者数组。因此,此主题不会再通知任何人