2

新しいストリームのみが操作されるように、mergeまたは機能にどのストリームが入ってくるかを特定する方法について、いくつかのベスト プラクティスの提案を探しています。combineLatest

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

発生した問題は次のとおりです。

  • usingmergeは、どのストリームが着信しているかを示すものではありません。
  • usingcombineLatestは、サブスクライブされたストリームをトリガーしたストリームを示すものではないため、そのストリームに関連する操作のみを実行することはできません。
  • withLatestFrom入力ソースを更新しない新しいリストを使用withLatestFromすると、このリストに関心のある次のストリームもそのリストを購読しない限り、リストは同期しなくなります (または、その前のリストに基づいてすべての新しいリストが作成されます。これにより、それ以前に発生したすべての変換を不必要に再実行することになります...)。

どういうわけか次善のように見える現在見つかったアプローチには、次のものがあります。

  • Cycle JS TODO アプリtypeは、識別のために以前のストリームの作成済みオブジェクトに明示的にプロパティを直接割り当てます。
  • http://www.jisaacks.com/manipulating-rxjs-streams/からの提案を取り入れ、追加ストリームと削除ストリームの出力を and に分割して[null, {addItem}]、追加イベントと削除イベントの両方[removeItem, {null}]に使用する場合mergeでも、着信を識別できるようにします1 つのストリームで追加と削除の両方を実行できるように更新されていたストリーム (ただし、トグル イベントなどを追加したいのですが、ストリーム出力を作成する必要があるため、これも正しくないようです)他のすべての潜在的なストリーム ([null、null、myOutput、null、null など] で終わる) を認識します。

ベストプラクティスの提案は大歓迎です。

4

2 に答える 2

0

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

私が個人的に好む方法は、カリー化された関数を使用することです。

function label(identifier){return function (x){var obj={};obj[identifier]=x;return obj;};}

私は次のように使用します:

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

しかし、私の意見では、これをどのように行うかはかなり小さな問題です。

于 2016-03-22T20:23:06.750 に答える