使用 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 仅充当中介。

我不知道这是设计使然还是错误。不过我觉得第一种可能性更大