2017-01-18 4 views
3

私が観察を含むサービスを持っていると私は、次のコードをお持ちの場合...Observableから1つのRXJS Observerを削除することはできますか?

this.collapse.newChild.subscribe(name => { 
     if (name === "helpArea") { 
      this.collapse.process("helpArea", true); 
     } 
     // I would like to detach now 
    }); 

は、それが元のサブスクリプションをキャンセルせずに取り外すことができますか? unsubscribeに電話すると、this.collapse.newChild.next("thing")と呼ぶと、エラーError: object unsubscribedがスローされます。

私は脱退が私が探しているものだとは思わないので、単一のオブザーバーを切り離す方法はありますか?

今の回避策として、私は...

this.collapse.newChild.map(name => name === "helpArea").first().subscribe(...)

答えて

1

を使用しています私はあなたの「回避策」は全然悪いとは思いません。 Rx が欲しいのはです。しかし、述語を受け取るfirstの形式を使用して、少し短く書くことができます。一般的に

this.collapse.newChild 
     .first(name => name === "helpArea") 
     .subscribe(...); 

、Rxのでに入るための考え方は副作用の可能使用コンビネータはあなたが必要とする正確な値を生成するためのストリームを操作して、最終的に適用され、簡単なハンドラで購読することと同じくらいにあります、ステップ:UIの更新、サービスの呼び出しなど。これにより、よりクリーンで表現力豊かなコードが読みやすく、再利用しやすくなります。

このアプローチのもう一つの良い点は、退会する必要がないことです。それ以上ないことが分かっているので、RXは最初の値の後でそれを行います。だから、自分でやるよりもはるかにクリーンです。

1

ピーターの答えはデザイン/練習のPoVから正しいですが、あなたはunsubscribeのためこのエラーが発生することにも注意してください。

あなたが停止することは代わりにサブスクリプションである:

var subscription = this.collapse.newChild.subscribe(...) 

// NOT this 
// this.collapse.newChild.unsubscribe() 

// this 
subscription.unsuscribe() 

これは殺す/対象外停止が、それだけにあなたの現在のサブスクリプションます。

0

サブスクリプションオブジェクトのunsubscribe()を呼び出すと、この特定のオブザーバのみがサブスクライブ解除されます。だから問題は、first()を使用すると、どのようにして脱退を起こすかの完全な通知を送信するので、最初にどのように脱会したかということです。

ところで、あなたは常にあなた自身の加入者のコールバック内で解除することができます

var subscription = this.collapse.newChild.subscribe(name => { 
    if (name === "helpArea") { 
     this.collapse.process("helpArea", true); 
    } 
    subscription.unsubscribe(); 
}); 
関連する問題