問題タブ [rxjs5]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
162 参照

rxjs - rxjs を使用した戻り値のフィルタリングと検証へのアプローチ

したがって、rxjsを使用して実装する方法を理解しようとしているシナリオは次のとおりです。

  1. ファイル/データベース/etc からメタデータのセットを読み込みます。メタデータの各要素には、ID と追加情報 (実際のデータの場所など) があります。現在、アプリケーションの開始時にこのメタデータをすべて非同期でロードしています。このデータが読み込まれると、Observable 呼び出しが完了します。最終的にはリフレッシュ機能を追加するかもしれません

  2. アプリケーションの後で、メタデータで利用可能なデータに基づいて、特定のデータ セットをロードする必要があります。私は現在、 fetchData(ids:string[]):Observableのような関数でこれを行おうとしています。これは、rxjs パラダイムの下でどのように進めるかについて私が不明な点です。fetchDatum(id:string):Observableのような関数を使用して単一のアイテムをリクエストする方法についても同様に確信が持てません

もちろん、フィルターを使用して、リスト内の名前のいずれかに一致する IMetadata Observable から発行された IMetdata アイテムのみを操作できますが、要求されたすべてのアイテムが IMetadata Observable 発行で見つかることも確認する必要がありますエラーする必要があります。

したがって、誰かが id = "Bob" の IMetadata を要求した場合、ソースの Observable から発行された IMetadata がない場合は、エラーが発生する必要があります。または、{ "Shirley", "Rex", "Samantha" } を要求し、"Rex" のデータがない場合、エラーになります。

ここで Rx.Subject を使用することを検討しましたが、私が読んだことから、rxjs パラダイムでは一般的に望ましくありません。rxjsパラダイムの下で、このシナリオでどのアプローチが機能するかについてアドバイスしてください。ありがとう!

0 投票する
1 に答える
225 参照

angular - forkJoin で 2 つの独立した Observable を作成できません

ID をパラメーターとして受け取り、ID に応じて HTTP 呼び出しを行う関数があります。Observable を返します。異なるパラメータを使用した呼び出しは完全に独立していると予想していましたが、互いに影響を与え合っています。

http 呼び出し Typescript 1.8.2には
RxJS 5.0.0-beta.2
Angular 2.0.0-beta.7を使用します。

コード:

予想される行動:

私は最初のコンソールを呼び出します
getCharacterDetails(1).subscribe((details) => { this.details = details }));
.logは私のEMPTY_MODELを出力します。
2 番目の console.log は、ID 1 のキャラクター モデルを出力します。

次に
getCharacterDetails(2).subscribe((details) => { this.details = details });
、最初のconsole.logにEMPTY_MODELを出力します。
2 番目の console.log は、ID 2 のキャラクター モデルを出力します。

実際の動作:

私は最初のコンソールを呼び出します
getCharacterDetails(1).subscribe((details) => { this.details = details }));
.logは私のEMPTY_MODELを出力します。
2 番目の console.log は、ID 1 のキャラクター モデルを出力します。

getCharacterDetails(2).subscribe((details) => { this.details = details });
最初の console.log は ID 1 のキャラクター モデルを出力します。 < - 問題
2 番目の console.log は ID 2 のキャラクター モデルを出力します。

2 つの呼び出しが完全に独立していないのはなぜですか? 2 番目の呼び出しは、最初の呼び出しのデータをどのように認識しますか?

0 投票する
1 に答える
448 参照

rxjs5 - Rxjs5 のユーザー ペアを作成する方法はありますか?

Rxjs5 で Rx.Observable.pairs を見つけることができません。必要なのは、オブジェクトを Observable に変換し、各プロパティの変更を調べるだけです。何か案は?

0 投票する
2 に答える
462 参照

angular - サブジェクトをオブザーバブルに変換

この例を で実行したいと思いrxjs5ます。しかし、うまくいきません。私は#41 行で立ち往生しています。マップが返さSubjectれ、メソッドがありません.takeUntil。それを実装する最良の方法は何ですか?ありがとう

0 投票する
1 に答える
2796 参照

javascript - 簡単なRxJSの例で、サブジェクトまたは命令操作を使用せずに状態を管理する方法は?

私は RxJS を 2 週間実験してきましたが、基本的には気に入っていますが、状態を管理するための正しいパターンを見つけて実装することができないようです。すべての記事と質問は一致しているように見えます:

  • Subject変換を介して状態を単にプッシュすることを支持して、可能な限り避けるべきです。
  • .getValue()完全に非推奨にする必要があります。と
  • .doDOM操作を除いて、おそらく避けるべきですか?

このようなすべての提案の問題は、「Rx の方法を学び、Subject の使用をやめる」以外に、代わりに何を使用すべきかを直接述べている文献がないように見えることです。

しかし、ステートレスで機能的な方法で、他の複数のストリーム入力の結果として、単一のストリーム/オブジェクトへの追加と削除の両方を実行する正しい方法を具体的に示す直接的な例はどこにも見つかりません。

再び同じ方向性を指摘する前に、未公開の文献の問題点は次のとおりです。

  • リアクティブ プログラミング入門 見落としていました: すばらしい入門テキストですが、これらの質問に具体的には触れていません。
  • RxJS の TODO の例は React に付属しておりSubject、React ストアのプロキシとして s を明示的に操作する必要があります。
  • http://blog.edanschwartz.com/2015/09/18/dead-simple-rxjs-todo-list/state :アイテムの追加と削除にオブジェクトを明示的に使用します。

私のおそらく 10 回目の標準 TODO の書き直しは次のとおりです。

  • 変更可能な「アイテム」配列で始まる - 状態が明示的で命令的に管理されているため悪い
  • scan新しいアイテムをストリームに連結するために使用してからaddedItems$、削除されたアイテムが削除された別のストリームを分岐します -addedItems$ストリームが無限に大きくなるので悪いです。
  • それを発見BehaviorSubjectして使用することは、新しい放出ごとupdatedList$.next()に以前の値を反復する必要があるため、悪いように思えました。つまり、それSubject.getValue()が不可欠です。
  • 追加イベントの結果をフィルタリングされた削除イベントにストリーミングしようとしますinputEnter$が、新しいストリームごとに新しいリストが作成され、それをストリームにフィードするとtoggleItem$toggleAll$新しいストリームはそれぞれ前のストリームに依存することになり、4 つのうちの 1 つが発生します。アクション (追加、削除、アイテムの切り替え、またはすべての切り替え) では、チェーン全体を不必要に再実行する必要があります。

今、私は完全に一周し、以下に示すように、 と の両方を使用することに戻りましたSubject(そして、使用せずにどのように連続して反復する必要があるのgetValue()でしょうか?) do。私自身も同僚も、これが最も明確な方法であることに同意しますが、もちろん、これは最も反応が少なく、最も必須の方法のように思えます。これに対する正しい方法に関する明確な提案は大歓迎です!

編集

@ user3743222の非常に役立つ回答に関連して、追加の入力として状態を表すと関数が純粋になり、scanその時点までの以前の状態のスナップショットを使用して、時間の経過とともに進化するコレクションを表す最良の方法であることがわかります。追加の関数パラメーター。

addedItems$ただし、これは、入力のスキャンされたストリームを使用して、2 回目の試みにアプローチした方法です。

明らかな解決策はitems = []、 を持って直接操作するか、またはconst items = new BehaviorSubject([])- を反復する唯一の方法はgetValue、以前の状態を公開するために を使用することです.それは実際には公開されるべきではありません (ただし、公開されていない場合、どのように使用できるのでしょうか?)。

ストリームでは、サブジェクトを使用したり、状態「ミートボール」を介して何かを表したりすることは想定されていないという考えがあったと思います。最初の回答では、これがマスチェーンストリームを導入しない方法がわかりません孤児/無限に成長/正確な順序で互いに構築する必要があります。

0 投票する
2 に答える
537 参照

javascript - RxJS:結合されたストリームでストリームソースを識別するための正しいパターン?

新しいストリームのみが操作されるように、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 など] で終わる) を認識します。

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