我有一个主题负责订阅某些observable:
var timer$ = Rx.Observable.timer(1000, 2000);
当主题与主题相关联时
var timerSubject = new Rx.Subject;
timer$.subscribe(timerSubject);
var subscription1 = timerSubject.subscribe(n => console.log(n));
var subscription2 = timerSubject.subscribe(n => console.log(n));
setTimeout(() => timerSubject.unsubscribe(), 4000);
一切都很好,timerSubject.unsubscribe()
可以调用一次,订阅不应该逐个取消订阅。
使用Subject.create
创建主题时(plunk)
var timerSubject = Rx.Subject.create(null, timer$);
var subscription1 = timerSubject.subscribe(n => console.log(n));
var subscription2 = timerSubject.subscribe(n => console.log(n));
setTimeout(() => timerSubject.unsubscribe(), 4000);
timerSubject.unsubscribe()
什么都不做,而我希望它与第一个片段中的行为相同。
如果Subject.create
创建的主题甚至无法取消订阅,那么Subject.create
的目的是什么?
为什么会这样?这是一个错误吗?
如何创建主题以达到所需的行为?
可与RxJS 5 RC1重现。
答案 0 :(得分:3)
我查看了source code for Subject.create()
,但它与calling new Subject()
不一样。
Subject.create()
返回AnonymousSubject
。
new Subject()
返回Subject
。
因此unsubscribe()
AnonymousSubject
source
无效的问题似乎是因为它实际上从未订阅过。它只保留对source
Observable的引用,并在订阅Observer时直接将timerSubject.subscribe()
与Observer连接,并且不跟踪创建的订阅。
在您拨打timer$
的情况下,它直接订阅AnonymousSubject
,而{{1}}仅作为调解员。
我不知道这是设计还是错误。但是,我认为第一种选择更有可能。