2016-09-26 2 views
1

Rxjsを初めて使用しています。可能であればベストプラクティスに従いたいと思います。Node.jsでObservableに3つの異なる機能をマップします

私は、観察可能なデータで返される同じデータに対して3つの異なる機能を実行しようとしています。 「データのストリーム」コンセプトに続いて、私はこのObservableを3つのストリームに分割して実行する必要があると考え続けます。ここで

は私のコードであるので、私は抽象的に話を停止することができます:

// NotEmptyResponse splits the stream in 2 to account based on whether I get an empty observable back. 
let base_subscription = RxNode.fromStream(siteStream).partition(NotEmptyResponse); 

// Success Stream to perform further actions upon. 
let successStream = base_subscription[0]; 

// The Empty stream for error reporting 
let failureStream = base_subscription[1]; 

//Code works up until this point. I don't know how to split to 3 different streams. 
successStream.filter(isSite) 
      .map(grabData)// Async action that returns data 
      /*** Perform 3 separate actions upon data that .map(grabData) returned **/ 
      .subscribe(); 

私は3に、このデータ・ストリームを分割し、異なる機能へのデータの各インスタンスをマップするにはどうすればよいですか?

+0

「データの各インスタンスを別の関数にマップする」とはどういう意味ですか? 'siteStream'を2つではなく3つのオブザーバブルに分割したいのですか? – martin

答えて

1

実際にはpartition()演算子は内部ではただcalls filter() operator twiceです。最初にpredicateに一致する値からObservableを作成し、次にpredicateと一致しない値に対してObservableを作成します。

ですから、filter() operatorとまったく同じことを行うことができます。

let obs1 = base_subscription.filter(val => predicate1); 
let obs2 = base_subscription.filter(val => predicate2); 
let obs3 = base_subscription.filter(val => predicate3); 

を今、あなたは3つの観測、唯一のいくつかの特定の値を発光し、それぞれを持っています。次に、あなたの既存のコードに続けていくことができます。

obs2.filter(isSite) 
    .map(grabData) 
    .subscribe(); 

ちょうどsubscribe()を呼び出すと、観察可能なソースから生成値をトリガーすることに注意してください。これはObservableが何を使用しているかによって常にこのようにする必要はありません。ドキュメントの“Hot” and “Cold” Observablesを参照してください。 Operator connect()はあなたのユースケースによってはあなたにとって役に立つかもしれません。

+0

私はゆっくりとこれを昨夜解りましたが、あなたは私の疑惑を確認しました。私は接続オペレータをチェックアウトします。ヘルプをよろしくお願いいたします。 – calbear47

関連する問題