オブザーバブルはメモリリークを心配しています。以下を作成した場合:
_private client = new BehaviorSubject("");
clientStream$ = this.client.asObservable();
_
そして、そのような見解で彼らにsusbscirbe:
_this.clientService.clientStream$.subscribe(
client => {
this.client = client;
}
}
_
退会する必要がありますか?client.getValue()
を呼び出した場合はどうなりますか?
退会する必要がありますか?
恐らく。
完了するサブジェクトを設計している場合、つまり、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()を呼び出した場合
これにより、現在の値が同期的に得られます。あなたはまったく購読していません。メリットとしては、登録を解除する必要がないということです。しかし、マイナス面として、値がいつ変化するかを確認したくない場合に、ビヘイビアーサブジェクトを使用するのはなぜですか。