【问题标题】:RxJS: BehaviorSubject unsubscribeRxJS:BehaviorSubject 取消订阅
【发布时间】:2017-09-13 17:15:25
【问题描述】:

我对 observables 很陌生,担心内存泄漏。如果我创建以下内容:

private client =  new BehaviorSubject("");
clientStream$ = this.client.asObservable();

并在这样的视图中接受他们:

this.clientService.clientStream$.subscribe(
  client => {
    this.client = client;
  }
}

我需要退订吗?如果我打电话给client.getValue()怎么办?

【问题讨论】:

    标签: javascript rxjs observable


    【解决方案1】:

    我需要退订吗?

    大概吧。

    如果你正在设计一个可以完成的主题——即,如果你打算打电话给client.complete()(或client.onCompleted(),如果你使用的是rxjs 4)——那么这将自动取消订阅。

    但很多时候,你的行为主体会在一些持续存在的服务中,而你不希望它完成。在这种情况下,您需要取消订阅。您可以通过两种方式取消订阅:

    1) 手动:

    当你调用 .subscribe 时,你会得到一个订阅对象。如果你在上面调用.unsubscribe()(rxjs 4 中的.dispose()),你将取消订阅。例如:

    const subscription = this.clientService.clientStream$
        .subscribe(client => this.client = client);
    
    setTimeout(() => subscription.unsubscribe(), 10000); // unsubscribe after 10 seconds
    

    2) 自动,基于另一个 observable。如果您经常在应用程序中使用可观察对象,您可能会发现这种方法非常方便。

    Observable 有一个 .takeUntil 运算符,您可以将另一个 observable 传递给它。当第二个 observable 发出一个值时,它将为您取消订阅。这使您可以预先描述哪些条件应该破坏您的 observable。例如:

    this.clientService.clientStream$
        .takeUntil(Observable.timer(10000))
        .subscribe(client => this.client = client);
    

    如果我调用 client.getValue() 会怎样

    这将同步为您提供当前值。你根本没有订阅。从好的方面来说,这意味着您无需取消订阅。但不利的一面是,如果您对值何时更改不感兴趣,为什么还要使用行为主题?

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2017-12-18
      • 2012-03-14
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多