web-dev-qa-db-ja.com

RxJS:BehaviorSubjectの登録解除

オブザーバブルはメモリリークを心配しています。以下を作成した場合:

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

そして、そのような見解で彼らにsusbscirbe:

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

退会する必要がありますか?client.getValue()を呼び出した場合はどうなりますか?

7
Jeremy Thomas

退会する必要がありますか?

恐らく。

完了するサブジェクトを設計している場合、つまり、client.complete()(または、rxjs 4を使用している場合はclient.onCompleted())を呼び出す場合、これにより、サブスクリプションを自動的に。

しかし、多くの場合、あなたの行動主体は持続するいくつかのサービスにあり、それを完了させたくないでしょう。その場合は、退会する必要があります。退会するには2つの方法があります。

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演算子。これを別のオブザーバブルに渡すことができます。その2番目のオブザーバブルが値を発行すると、サブスクリプションが解除されます。これにより、オブザーバブルを破壊する条件を前もって説明できます。例えば:

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

Client.getValue()を呼び出した場合

これにより、現在の値が同期的に得られます。あなたはまったく購読していません。メリットとしては、登録を解除する必要がないということです。しかし、マイナス面として、値がいつ変化するかを確認したくない場合に、ビヘイビアーサブジェクトを使用するのはなぜですか。

10
Nicholas Tower