【问题标题】:Unsubscribe on subject in RxJS取消订阅 RxJS 中的主题
【发布时间】:2019-01-24 11:17:33
【问题描述】:

我发现以下构造对我来说有点混乱(打字稿中提供了示例):

let someSubject: Subject<any> = new Subject();
let subscription1: Subscription = someSubject.subscribe((v) => {console.log(v)})
let subscription2: Subscription = someSubject.subscribe((v) => {console.log(v)})

很明显,我可以(并且应该)像这样取消订阅待定订阅:

subscription1.unsubscribe();
subscription2.unsubscribe();

但是 Subject 类确实有一个成员方法unsubscribe。这与主题是Observable 和Observer 的方法是一致的,但是从我在执行以下操作时实际取消订阅的内容来看:

someSubject.unsubscribe();

我是否要取消与该主题相关的所有其他订阅?

【问题讨论】:

  • 您几乎肯定不想在Subject 中调用unsubscribe。见Closed Subjects。事实上,这是一个很可能会从 v7 中的Subject 中删除的方法。
  • @cartant 我本来想问你从哪里得到这个信息的,但后来我看到你的 RxJS 职业:) 谢谢你指出你的文章,现在很清楚了。

标签: rxjs


【解决方案1】:

看起来我有点急于提出一个问题。无论如何,因为我认为这没有很好的记录,如果您通过一些共享服务提供您的主题,可能会导致可怕的错误,下面是示例代码:

a = new Rx.Subject();

a.next(5) // No console log
s1 = a.subscribe((v) => console.log(v));
s2 = a.subscribe((v) => console.log(v*2));
a.next(5); // 5 & 10 will print out
s2.unsubscribe();
a.next(5); // 5  will print out
s2 = a.subscribe((v) => console.log(v*2)); // I can legally attach/reattach subscriber
a.next(5); // 5 & 10 will print out
a.unsubscribe(); // shut down WHOLE subject
a.next(5) // Will cause ObjectUnsubscribedError
s2 = a.subscribe((v) => console.log(v*2)) // Will cause ObjectUnsubscribedError

要点是unsubscribe 不仅会关闭整个主题(使其无法发出和订阅它),还会清除所有内部观察者数组。所以这个主题不会再通知任何人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2020-09-20
    • 1970-01-01
    • 2017-03-26
    • 2020-10-28
    相关资源
    最近更新 更多