2017-03-09 14 views
6

私は、メモリリークを防ぐためにObservable(つまりObservableがの値が無限の値)を購読解除する必要があることを理解します。私はそれを行う必要はありません有限 Observablesが完了すると自動的にunsubscribe角度2/Rxjs:本当に購読を解除する必要がありますか?

しかし、私は私のコンポーネントで無限Observableを作成した場合(例えば、FormGroup.valueChanges、またはQueryList.changesのために)、これは、それを含むコンポーネントで破壊されますので、私は彼らもメモリリークしないであろうというを考えるもし私がでない場合はから退会してください。ここで

は簡単な例である:ここでは

@Component({}) 
export class DummyComponent { 
    form: FormGroup; 

    constructor(private fb: FormBuilder) { 
     this.form = this.fb.group({ 
      firstName: [''], 
      lastName: [''] 
     }); 
     this.form.valueChanges.subscribe(
      x => console.log(x) 
     ); 
    } 
} 

、私はthis.form.valueChangesからではないunsubscribeを行います。私のコンポーネントが破壊されると、this.form.valueChangesも破壊されます。

この場合、メモリリークが発生しますか?

+3

サブスクリプション(...)に完全なコールバックを追加しようとしましたが、コンポーネントが破棄されたときに呼び出されるかどうかを確認しましたか? –

+0

私はしていて、呼び出されていません(私は 'this.form.valueChanges'でテストしました)。 – freedonaab

+0

退会するのが良いと思いますが、必要はありません。コンポーネントが破棄されたときにガベージコレクションが行われ、そのサブスクリプションでサブスクリプションが取得されるため、メモリリークが予想されません。サブスクリプションをコンポーネント(サービスなど)の外で購読したり渡したりすると、コンポーネントがGCedされるのを防ぐことができますが、すべてがコンポーネント内にあれば傷ついてはいけません。 –

答えて

4

Babarに言及したように、サブスクリプションを停止して変更を監視し続ける必要があります。

具体的なケースについては、あなたにはポイントがあると思います。

同じコンポーネントにたくさんのサブスクリプションがあるときに私がすることは、次のとおりです。

まず、サブスクリプションタイプの空の配列である「サブスクリプション」を作成します。

private subscriptions: Subscription[] = []; 

それから私が行う必要があるたびに、私は、配列

this.subscriptions.push(this.form.valueChanges.subscribe(x => console.log(x))); 

そして、私は、アレイ内のすべてのサブスクリプションに退会ngOnDestroy内に押し込み購読。

ngOnDestroy(): void { 
    this.subscriptions.forEach((elem) => { elem.unsubscribe(); }) 
} 
+1

サブスクリプションをsubscription.add()メソッドを使用して追加することができます。次に、トップサブスクリプションの登録を解除するだけです。 – DarkNeuron

2

あなたのコンポーネントが破壊されると、あなたの加入者はまだイベントが来るのを待っているわけではなく、メモリを消費することもあります。たとえば、ルータイベントのサブスクリプションは、アプリ内のどこでも起動し、サブスクリプション内で行ったコードを実行します。

私は2番目のケースでは、コンポーネントを切り替えると決して退会しないので、コンポーネントを読み込むたびに新しいサブスクライバがバインドされるため、アプリが束縛されてハングアップすることになります。

@Component({}) 
export class DummyComponent implements OnDestroy { 
form: FormGroup; 
subscription: Subscription; // from rxjs 
constructor(private fb: FormBuilder) { 
    this.form = this.fb.group({ 
     firstName: [''], 
     lastName: [''] 
    }); 
    this.subscription = this.form.valueChanges.subscribe(
     x => console.log(x) 
    ); 
} 

ngOnDestroy(): void { 
    this.subscription.unsubscribe(); 
} 
} 
関連する問題