使用Subject.create创建的主题无法取消订阅

时间:2016-10-20 16:34:23

标签: rxjs observable rxjs5

我有一个主题负责订阅某些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重现。

1 个答案:

答案 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}}仅作为调解员。

我不知道这是设计还是错误。但是,我认为第一种选择更有可能。