2017-03-06 5 views
2

私はObservablesとRxJSの仕組みを理解しようとしているので、これを使う方法のすべてではないかもしれません。RxJS Observablesは1人の加入者だけが処理できますか?

私はAngular2アプリケーションを使用しています。さらに、RxJS Observablesを使用してイベントを送信しています。今特別なタイプのエラーイベントについては、イベントが別のサブスクライバによってすでに処理されているかどうかを知りたいと思います。 Observableに複数のサブスクライバが存在する可能性があり、イベントの全責任を負い、他の人がそれをもはや取得しない可能性があります。

このアイデアは、ルーティングイベントがWPFでどのように機能するかに基づいています。設定した場合、イベントが取り扱わマークされる場合は、trueに設定し、

;:イベントハンドラでは、プロパティHandledを持ってRoutedEventArgsパラメータを取得しますそうでなければfalse。この値を読み取る場合、trueは、クラスハンドラーまたはルートに沿ったインスタンスハンドラーのいずれかが、すでにこのイベントを処理済みとしてマークしていることを示します。そのようなハンドラが処理されたイベントをマークしていないことを示します。 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware - - ミドルウェアがASP.NETコアパイプラインの中でどのように機能するか

別の実装例は以下のようになりますが、次のミドルウェアを呼び出すか、単に結果を返すことができます。

私はobservableパイプに投げたいイベントにHandledプロパティを追加することを考えていましたが、それがRxJSでこれを行う慣習的な方法であるかどうかはわかりません。

+0

あなたは確かに観察されたオブジェクトに突然変異を起こさせたくありません。 –

答えて

1

通常、観測可能でこれを行う方法はではありません。は観察可能なものを誰にも渡し、誰もがそれを購読します。代わりに、それぞれの関係者に「パイプラインに追加する」チャンスを与え、最後に一度購読します。これを行うには多くの方法があります。最も簡単なのは、誰にも観測可能なものを与えないことです。しかし、その代わりに彼らはコールバックを提供してみましょう:

class Foo { 

    observable = ...; 
    callbacks = []; 

    addCallback(callback) { this.callbacks.push(callback); } 

    constructor() { 

     // subscribe to the observable and call any registered callbacks 
     this.observable.subscribe(e => { 
      for (const cb of this.callbacks) { 
       // callback returns true if it has "handled" the event 
       if (cb(e)) { 
        return; // do not call any other callbacks 
       } 
      } 
     }); 
    } 
} 

const foo = new Foo(); 

// subscriber1 handles "type1" events 
foo.addCallback(ev => ev.type === "type1"); 

// subscriber2 
foo.addCallback(ev => ev.type === "type2"); 

は、これが最も簡単な方法です。 Fooには、クライアントごとに観測値を公開し、その結果を監視してパイプラインを構築する方法があります。

+0

意味的には 'Subscribable'の実装と同じではありませんか?もしそうなら、私たちが直接行なわれれば、より構成が容易で、消費しやすくなるかもしれません。 –

+0

@AluanHaddadいいえ意味的に違いがありますが、そうでなければOPは質問しません。 RxJSでは、観測可能なソースから加入者へのデータフローを1つの方法で監視します。サブスクライバから観測可能なソースに戻る唯一の情報は、サブスクライブ/サブスクライブ解除コールです。この質問は、他の加入者が値を参照しないように、加入者が上流に通信する方法についてです。 – Brandon

+0

右ではあるがObservableは、Subscribableの実装を通じてサブスクライブされている。また、OPは、イベントが外部からこの事実を伝えないように処理されているかどうかを知りたがっていると言います。私は正直に好奇心が強いですが、私は有効な加入者の構成要素が分からないためです。言い換えれば、このようにフィルタリングすることは許可されていますか?私はそう思うだろう。 –

関連する問題