2017-03-03 9 views
0

私はRxJSの初心者ですが、MS-Excelとまったく同じように動作するobservableのチェーンを実装しようとしています。概念:エクセルに「名前」、「年齢」、「性別」、「国」、「郵便番号」の5つの列があるとします。他の列に表示されているレコードにも影響するフィルタを各列に個別に適用することができます。Rxjs 5:Observableのチェーンを確立するには?

ここで、データソースはデータバックエンドサービスを受け取ります。データソースには、「addRecord」という&「removeRecord」という2つの関数しかありません。

ここで達成しようとしているのは、Observableを作成してデータソースにアタッチすると、OBS-1という名前でデータソースからデータを受け取るということです。 OBS-1は独自のフィルタを持つことができます。データOBS-1(OBS-1のフィルタがあればフィルタリングされたデータ)を受け取る別のObservable OBS-2を作成します。もう1つObservableは、OBS-3からOBS-2(OBS-2の場合はフィルタリングされたもの)からデータを受信するなどと言います。

OBS-2が破棄(登録解除)されている場合、OBS-3はOBS-1からデータを受信します。

これをRxJsでどのように達成できますか?

答えて

1

私はあなたがRxについていくつか誤解していると思います。オブザーバブルにはフィルタがなく、あなたは '生きていない'というフィルタを追加して削除します。また、誰が購読しているかに基づいてデータを転送することもありません。

代わりに、コールチェーンを構築します。あなたは、addRecordのものとremoveRecordイベントのもののように、観測可能なソースから始めます。次に、これらの観測値を連鎖させて、Rx内のさまざまな観測点から新しいoperatorsを作成し、最終的に観測可能な観測値に登録します。サブスクリプションはチェーン全体をアクティブにし、ソースイベントが発生するとすべての演算子がトリガーされ、最終的にイベントはフィルタリングされていない場合はsubscribeになります。

実際にあなたがRxで説明したことを行うことができます。たとえば、オブザーバブル上のフィルタを変更することは、シーケンスを別のシーケンスに投影し、毎回新しいシーケンスに切り替えるようにするオペレータのswitchMapで比較的簡単に実行できます。例えば、filterSource.switchMap(filterFunction => Obs-1.filter(filterFunction))。これより簡単な場合でも、最初のサブスクリプションの登録を解除し、Rxチェーンを再度設定することができます。しかし、関数のビルドを使用すると、多くのジャグリング状態が外れます。

しかし、実際にはこのような複雑な動作は必要ないと強く思っています。あなたが望むものは、次のように単純にアーカイブすることができます:

var Src-1 = fromEvent(dataSource, 'addRecord') // create the first source 
var Src-2 = fromEvent(dataSource, 'removeRecord') // and the other source 
var Obs-1 = Src-1.combineLatest(Src-2) // combine both sources 
    .filter(e => someCondition(e)) // filter the source 
var Obs-2 = Obs-1.mergeMap(e => someOtherCondition(e) ? Change(e) : Rx.Observable.of(e)) // on someOtherCondition, either transform the source with the `Change(e)` function. Or keep it unchanged with `of(e)` 
var Obs-3 = Obs-2.filter(e => anotherCondition(e)) // Filter again 
var sub = Obs-3.subscribe() // activate the sequence. 
+0

私を訂正してくれてありがとう。各オブザーバ(OBS-1、OBS-2など)は、データを受信する独自​​のサブスクリプションを持つことができます。実際、オブザーバは動的に追加されます。これを行うにはどうすればいいですか? – user3130446

+0

どのように動的に観測値を受信しますか?定期購読を意味しないのですか?私は、あなたが望むものの中でより具体的にする必要があると思っています。 Rxはリアクティブプログラミングに関するものであり、リアクティブプログラミングでは、データがどこから来ているかを理解することが重要です。ソースがクリアされると、残りの部分が落ち込み、間違った解決策を探しているようです。 – Dorus

関連する問題