2017-09-13 13 views
1

私は、メモリリークが心配です観測に非常に新しいです。RxJS:BehaviorSubjectは退会

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

などのような景色に彼らにsusbscirbe:私は次のように作成した場合

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

は私が退会する必要がありますか?私はclient.getValue()は何と呼ばれますか?

答えて

2

私は解除する必要がありますか?おそらく

あなたが完了します件名を設計している場合 - つまり、あなたは(あなたがrxjs 4を使用している場合やclient.onCompleted()client.complete()をコールする場合は、 - これは、自動的にサブスクリプションを取り壊すます。

しかし、しばしば、あなたの行動の対象は持続し、いくつかのサービスになります、そしてあなたはそれが完了する必要はありません。その場合は、退会する必要があります。

1)手動:あなたが退会できる2つの方法がありますあなたが.subscribeを呼び出すときは、サブスクリプションオブジェクトを

取り戻します。あなたは(rxjs 4で.dispose())それに.unsubscribe()を呼び出す場合は、解除されます。例:

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を呼び出した場合。あなたは全く購読していません。上手に、これはあなたが購読を解除する必要はないことを意味します。しかし、あなたの価値観が変わるのを見たいと思っていないのであれば、なぜあなたは行動主題を使っていますか?

関連する問題