javascript - RxJS: BehaviorSubject 退订

标签 javascript rxjs observable

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

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

并在这样的观点中支持他们:

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

我需要取消订阅吗?如果我调用 client.getValue() 会怎样?

最佳答案

do I need to unsubscribe?

可能。

如果您正在设计一个将要完成的主题——即,如果您打算调用client.complete()(或client.onCompleted(),如果您're using 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 有一个 .takeUntil 运算符,您可以将另一个 observable 传递给它。当第二个可观察对象发出一个值时,它将为您取消订阅。这让您可以预先描述什么条件应该破坏您的可观察对象。例如:

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

What if I called client.getValue()

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

关于javascript - RxJS: BehaviorSubject 退订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46203364/

相关文章:

javascript - NodeJS 应用程序如何使用 HTTP 请求从禁用的 CORS(跨源共享)服务器访问资源?

JavaScript onclick

javascript 对象初始化 {key :val, string}

angularjs - 来自 unpkg 的 rxjs bundle

javascript - 结果为 false 时重试订阅

angular - 路由更改时组件之间的BehaviorSubject

javascript - Ngx-Bootstrap Typeahead 在输入清除时保留下拉值

javascript - Vue : get list of components

android - RxJava Observable 从不执行 onCompleted

javascript - Rxjs iif 或简单 if