我发现以下构造对我来说有些混乱(打字稿中提供了示例):
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();
我要取消与此主题相关的所有其他订阅吗?
答案 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
不仅将关闭整个主题(使其无法发出和订阅),而且将清除所有内部观察者数组。因此,此主题不会再通知任何人