RxJS:BehaviorSubject取消订阅

时间:2017-09-13 17:15:26

标签: javascript rxjs observable

我对可观察到的新手很担心内存泄漏。如果我创建以下内容:

SharedPreferences preferences = this.getActivity().getSharedPreferences("myPref", Context.MODE_PRIVATE);

和susbscirbe在他们看来像这样:

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

我是否需要取消订阅?如果我致电this.clientService.clientStream$.subscribe( client => { this.client = client; } } 该怎么办?

1 个答案:

答案 0 :(得分:6)

  

我需要取消订阅吗?

可能。

如果您正在设计一个将完成的主题 - 例如,如果您打算拨打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有一个.takeUntil运算符,您可以将其传递给另一个observable。当第二个observable发出一个值时,它会为你取消订阅。这可以让你预先描述什么条件应该拆除你的观察。例如:

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

如果我调用了client.getValue()

,该怎么办?

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