使用 Subject.create 创建的主题无法退订
Subjects created with Subject.create can't unsubscribe
我有一个主题负责订阅某些可观察对象:
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
像这样 (a 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 重现。
我检查了source code for Subject.create()
and it's not the same as calling new Subject()
。
Subject.create()
returns AnonymousSubject
.
的实例
new Subject()
returns Subject
.
的实例
所以 unsubscribe()
在 AnonymousSubject
上不起作用的问题似乎是因为它实际上从不订阅。它只是保留对 source
Observable 的引用,并且在订阅 Observer 时它直接 source
与 Observer 连接并且不跟踪创建的订阅。
在您调用 timerSubject.subscribe()
的情况下,它会直接订阅 timer$
并且 AnonymousSubject
仅充当中介。
我不知道这是设计使然还是错误。不过我觉得第一种可能性更大
我有一个主题负责订阅某些可观察对象:
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
像这样 (a 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 重现。
我检查了source code for Subject.create()
and it's not the same as calling new Subject()
。
Subject.create()
returnsAnonymousSubject
. 的实例
new Subject()
returnsSubject
. 的实例
所以 unsubscribe()
在 AnonymousSubject
上不起作用的问题似乎是因为它实际上从不订阅。它只是保留对 source
Observable 的引用,并且在订阅 Observer 时它直接 source
与 Observer 连接并且不跟踪创建的订阅。
在您调用 timerSubject.subscribe()
的情况下,它会直接订阅 timer$
并且 AnonymousSubject
仅充当中介。
我不知道这是设计使然还是错误。不过我觉得第一种可能性更大