2016-03-21 5 views
-1

mergeまたはcombineLatest機能にどのストリームが入ってくるのかを特定する方法に関するベストプラクティスの提案を探しています。新しいストリームだけが操作されるようにします。RxJS:結合ストリーム内のストリームソースを識別するための正しいパターン?

TODOアプリケーションのコンテキストでは、着信の追加と削除のストリームがあり、それらを結合してリストの編集を1つのストリーム内でステートレスに行うことができます。出力は、追加(連結)イベントと削除(フィルタ)イベントの両方を統合したリストです。そうしないと、すべての追加イベントまたは削除イベントを含む他のストリームが無限に増加するように見えます。

問題に遭遇するには、次のとおりですmergeを使用して

  • が着信されたストリームを示すものではありません。
  • combineLatestを使用すると、どのストリームがサブスクライブされたストリームをトリガーしたのかわからないため、そのストリームに関連する操作だけでなく、
  • withLatestFromを使用すると、withLatestFromの入力ソースが更新されない新しいリストが生成されるため、このリストに興味のある次のストリームがそのリストに登録されていない限り、リストは同期しなくなります。その前に起こったもののためのあらゆる変形を不必要に再実行する...)。何とか次善のようだ

現在見つかったアプローチは、次のとおりです。

  • サイクルJS TODOアプリは、明示的に、私は考えがすべきだろうこれは、識別のため、以前のストリームの作成されたオブジェクトに直接typeプロパティを割り当てストリームがどこから来たのかを直接的に特定するRxJSメソッドを使用することを奨励してください。
  • 私ように、http://www.jisaacks.com/manipulating-rxjs-streams/から提案を取り、付加ストリームの出力を分割し、除去が[null, {addItem}][removeItem, {null}]に流れ、追加イベントを削除両方のためmergeを使用する場合、私はまだ更新されていた着信ストリームを識別できるように単一のストリームで追加と削除の両方を実行することができます(ただし、トグルイベントなどを追加したいのですが、他のすべてのストリームを認識しているストリーム出力を作成する必要があるため[NULL、NULL、myOutput、ヌル、ヌルなど]。

とまでの任意のベストプラクティスの提案は非常に歓迎されている。

答えて

1

ストリームがどこから来るのかを識別できるRxjsメソッドはありません。ストリームは名前を持たない。あなたが1つをしたい場合は、それを自分で置く必要があります。あなたがそれらの2つの方法のいずれかが好きでない場合は、その上に名前を付ける別の方法を見つけてください。あなたの質問がオブジェクトに識別子を付けるのがベストプラクティスであれば、答えは気になるオブジェクトに識別子を入れます。

私は個人的に賛成の方法は、カリー化関数を使用している:

次のように私が使用
function label(identifier){return function (x){var obj={};obj[identifier]=x;return obj;};} 

source1.map(label('remove')).merge(source2.map(label('add'))) 

が、本当に、あなたがこれを行う方法を、あなたのようにしてくださいやっていることはかなりあります私の意見では、マイナーな問題です。

+0

ありがとうございました。あなたの経験ではマイナーなように思えるかもしれませんが、私が欠けていた(そして正しいRxの方法で行っていなかった)いくつかの異なる方法が必要であると感じました。特に、combineLatestを使って特定のストリームが更新されたことを確認してください。だから私は実際にこれが本当に重要で正しいと思った(つまりオブジェクトに識別子を付ける)正しい方法ではないことが明確になっていないので、なぜ私の質問が投票されたのかわからない。いずれにしても、私はあなたのラベリング関数と共に 'merge'を使用します。ありがとうございます。 – brokenalarms

1

不要なID処理を避けるために、マージする前に正確なストリームを操作できます。一般的に、ストリームや関数型プログラミングでは、あなたを助けるためのツールがあるので、if-else構造を避けてみてください。通話がどこで行われているのかを調べることで、通話を避けることができます。

ここは例です。リストの操作は、最も重要な部分を可視にするための疑似的なものです。

リストにはBehaviourSubjectが使用されていますので、誰でも参加しても最新の状況になることができます。 AddObsストリームとremoveObsストリームは、同じシグネチャを持ち、マージできる操作にマップされます。現在のリストに対して操作が実行された後、結果をlistSubjectにリサイクルする必要があります。これでlistSubjectを購読することができ、そこから放出された最新のリストを取得することができます。

+0

あなたの意見をお寄せいただきありがとうございます。これは確かです。私はそれ以来、.withLatestFromが各状態をメモしているので、最初に思った通り、すべてを連鎖させることはありません。残念ながら、質問はすでに回答済みで、私はそのようにマークしていますので、正しいとはいえ質問に答えることもできません。 – brokenalarms

関連する問題