2017-01-08 10 views
1

誰かが)私は2番目の場合には、私は(退会しなければならないことを知っている私に、サブスクリプションのこの二つの方法、最初のケース角度2サブスクリプション

this.incMatService.incomingMaterialUpdate$.subscribe((model) => { 
     try { 
      code here 
     } catch (error) { 
      console.log(error); 
     } 
    }); 
    this.incMatService.incomingMaterialNew$.subscribe((x) => { 
     try { 
      this.imForm = this.initImForm(); 
     } 
     catch (error) { 
      console.log(error); 
     } 
    }) 

と第2ケース

subscription: Subscription; 
subscriptionToAdd: Subscription; 
subscription = this.incMatService.incomingMaterialUpdate$.subscribe((model) => { 
      try { 
       code here 
      } catch (error) { 
       console.log(error); 
      } 
     }); 
     subscriptionToAdd = this.incMatService.incomingMaterialNew$.subscribe((x) => { 
      try { 
       this.imForm = this.initImForm(); 
      } 
      catch (error) { 
       console.log(error); 
      } 
     }) 

の違いを説明することができ、私は最初のケースでどのように状況が見えるか分かりません。私は例に示しように私のサービスからのコードの他の

private updateIncomingMaterial = new ReplaySubject<IncomingMaterial>(0); 

private addNewIncomingMaterial = new Subject(); 

incomingMaterialUpdate$ = this.updateIncomingMaterial.asObservable(); 

incomingMaterialNew$ = this.addNewIncomingMaterial.asObservable(); 

updateIncMaterial(incomingMaterialToUpdate: IncomingMaterial) { 
    this.updateIncomingMaterial.next(incomingMaterialToUpdate); 
} 

addNewIncMaterial(){ 
    this.addNewIncomingMaterial.next(); 
} 

は、私は別のものでは一つの成分とsubscripeでこのイベントを発する

答えて

3

の違いは、後者の場合には、あなたが保存していることです変数のサブスクリプションではなく、最初のケースではそうではありません。

登録を解除する必要があるかどうかは関係ありません。観察可能項目のライフサイクルがコンポーネントよりも長い場合(つまり、コンポーネントが破棄された後でも既存のイベントやイベントを放棄している場合)、サブスクリプションを解除して、サブスクリプションを変数に格納してそのサブスクリプションを実行できるようにする必要があります。それ以外の場合は、メモリリークが発生し、イベントが発生するたびにコードを実行し続けます。

+0

私は変数によってそれをしないと、私はメモリリークの責任を負うようになるのですか? – Stefan

+0

いいえ。購読を停止しないと、メモリリークが発生します。また、登録を解除する必要があるので、後でunsubscribe()を呼び出すには、サブスクリプションへの参照を保持して変数に格納する必要があります。 –

+0

どのように私は最初のケースで私が解約することはできませんので、私はメモリリークがある可能性が理解できるように、より良い場合を認識する方法。 – Stefan

1

最初のケースでは、登録を参照しているだけでなく、キャンセルすることもできません。通常これは、自然に終了するソースで行われるため、キャンセルする必要はありません。 .unsubscribe()の代わりに、.takeUntil(endEvent$)で不要になったときにキャンセルするようにソースを変更することもできます。

+0

私は最初のケースで私は私がメモリリークを持っている可能性がありますので、私は脱退することはできません理解しているので、どのようにより良いケースを認識する方法は? – Stefan

+1

@Stefan 'takeUntil'を正しく使うと、リークしません。観測可能な 'takeUntil'が起動すると、ストリームに関連付けられたすべてのリソースが完了しGCされます。 – Dorus