gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:41:06 26 4
gpt4 key购买 nike

我有一个负责订阅某些可观察对象的主题:

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 重现。

最佳答案

我检查了 source code for Subject.create()它与 calling new Subject() 不同.

  • Subject.create() 返回 AnonymousSubject 的实例。

  • new Subject() 返回 Subject 的实例。

所以看来 AnonymousSubject 上的 unsubscribe() 不起作用的问题是因为它实际上从不订阅。它只保留对 source Observable 的引用,当订阅 Observer 时,它直接连接 source 与 Observer 并且不跟踪创建的订阅。

在您调用 timerSubject.subscribe() 的情况下,它会直接订阅 timer$ 并且 AnonymousSubject 仅充当中介。

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

关于rxjs - 使用 Subject.create 创建的主题无法取消订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40159886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com