RxJS:BehaviorSubject取消订阅

16

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

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

并在视图中订阅它们,如下所示:

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

我需要取消订阅吗?如果我调用了client.getValue()会发生什么?

1个回答

21

我需要取消订阅吗?

很可能需要。

如果你正在设计一个将会完成的主题 - 比如,如果你打算调用client.complete()(或者使用 rxjs 4 则为client.onCompleted())- 那么它会自动停止订阅。

但是通常情况下,你的行为主题将在某个服务中持久存在,你不希望它完成。在这种情况下,你需要取消订阅。你有两种方法可以取消订阅:

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) 根据另一个可观察对象自动进行。如果您在应用程序中经常使用可观察对象,您可能会发现这种方法非常方便。

可观察对象具有 .takeUntil 操作符,您可以将另一个可观察对象传递给它。当第二个可观察对象发出值时,它将为您取消订阅。这使您可以事先描述应该终止可观察对象的条件。例如:

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

如果我调用client.getValue()会发生什么?

这将同步地给您当前的值。您根本没有订阅。好的一面是,这意味着您不需要取消订阅。但是缺点是,如果您对查看值何时更改不感兴趣,那为什么要使用BehaviorSubject?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接