問題タブ [reactive-extensions-js]
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.
javascript - rx: 配列を複数のストリームに展開します
配列を保持するストリームがあり、その各要素には ID があります。これを ID ごとにストリームに分割する必要があります。これは、ソース ストリームが ID を保持しなくなったときに完了します。
たとえば、これらの 3 つの値を持つ入力ストリーム シーケンス
3 つのストリームを返す必要があります
id がなくなったので a は 3 番目の値で完了し、id が現れたので c は 2 番目の値で作成されました。
私はgroupByUntilを試していますが、少し似ています
そのため、ID でグループ化し、入力ストリームに ID がなくなったらグループを破棄します。これは機能しているように見えますが、入力の 2 つの使用法は私には奇妙に見えます。たとえば、単一のストリームを使用して groupByUntil の入力とグループの破棄を制御すると、奇妙な順序の依存関係が生じる可能性があります。
より良い方法はありますか?
アップデート
実際、ここには奇妙なタイミングの問題があります。fromArray はデフォルトで currentThread スケジューラを使用します。これにより、その配列からのイベントが入力からのイベントとインターリーブされます。グループの破棄条件は、間違った時点で (前の入力からのグループが処理される前に) 評価されます。
考えられる回避策は、fromArray(.., rx.Scheduler.immediate) を実行することです。これにより、グループ化されたイベントが入力と同期されます。
javascript - rxjs コードを構造化する方法
rxjsアプリをどのように構築しますか? 約 100 のおもちゃのイントロの例がありますが、アプリケーション全体のデータ フローを示す、ウィジェット、サブウィジェットなどを含む完全なアプリの例は 1 つもありません。
たとえば、ある状態のオブザーバブルがあるとします。ウィジェットに渡す必要があります。そのウィジェットには、その状態の一部を必要とするサブウィジェットがあります。購読はしていますか?
「ウィジェット」はモナドの外にあります。サブウィジェットは状態に対して監視可能なメソッドを使用できません。副作用としてウィジェットを実行すると、同じ問題が発生します。
それで、ストリームをウィジェットに渡しますか?もしそうなら、あなたは何を返しますか?
ウィジェットは状態にサブスクライブし、使い捨てを返しますか? 状態から派生したストリームを返しますか? もしそうなら、何が入っていますか?すべてのウィジェット/サブウィジェット/サブサブウィジェットからすべてのストリームをまとめて収集し、selectMany(identity) を多用して、サブスクライブする最終的なアプリケーション ストリームを取得して、すべてを開始しようとしますか?
また、ウィジェットが状態に基づいてオンデマンドでサブウィジェットを作成する場合、ウィジェットはそのサブウィジェットをどのように管理するのでしょうか? サブウィジェットごとにグループを持つ groupBy() を使用して解決策を試し続けていますが、ネストされたオブザーバブルからすべてのサブスクリプションまたはストリームを管理することは、信じられないほどの悪夢です。
アプリケーション全体の 1 つの例でも役に立ちます。
reactive-extensions-js - オブザーバブルをプロミスとして使用する例
RXオブザーバブルを使用して非同期コードの外観を改善する方法の例はありますか?
私は約束に代わるものを探しています.rxでそれがどのように行われるかを知りたいです.
javascript - rx データ ドリブン サブウィジェット
rxjs コードを構造化する方法 のフォローアップ、rx を使用するときにサブウィジェットを使用してウィジェットを構造化する方法について、サブウィジェットがデータ駆動型である rx コードをどのように構造化しますか?
おもちゃの問題として、値、高値、安値などを含む、監視する株式のリストをストリーミングする外部ソース (Web サービスなど) があるとします。つまり、次のような Observable ストリームがあるとします (時間は経過します):
銘柄ごとにウィジェットを作成する必要があります。したがって、前の質問のパターンを変更する必要があります。子は 1 つではなく、入力ストリームに基づいて子が作成/破棄されます。たとえば、最初のイベントで「csco」の子を作成します。2 番目のイベントで、「csco」の子が更新され (低: 8)、「aapl」の子が作成されます。
サブウィジェットの作成をサブスクライブに移動できます。
これにより、順序付けの問題が発生します。子は、それを作成する原因となったイベントを取得しません。state.repeat(1)
、またはのようなことを行うことでこれを回避できますstate.startsWith(s).select(...)
が、少し奇妙に見えます。
子もストリームを返しているとします。たとえば、ユーザーが子を操作してさまざまな位置をモデル化する可能性があるため、子から計算を取得して、全体の合計またはその他のメトリックをウィジェットに表示する必要があります。
widget() でサブジェクトを作成し、子からのストリームをプッシュしますか? お気に入り
これはすべてかなり不格好に思えます。それを整理するためのより良い方法はありますか?子ごとに 1 つのストリームのストリームとしてモデル化し、出力をマージしてみました。これはうまくいきませんでした。内部サブスクリプションを追跡したり、子から複数のストリームを出力したりするのは困難でした。
javascript - Rx のグリッチを回避する方法
他の「FRP」ライブラリとは異なり、Rx はグリッチ (時間の不一致データで呼び出されるコールバック) を防止しません。これを回避する良い方法はありますか?
例として、単一のストリームから派生した一連の高価な計算があるとします (たとえば、以下の _.identity の代わりに、並べ替えまたは ajax フェッチを行います)。高価なものの再計算を避けるために、distinctUntilChanged を実行します。
2 番目のイベントは、多数のグリッチ状態を引き起こすことになります。1 つではなく 3 つのイベントが発生するため、大量の CPU が浪費され、不一致のデータを明示的に回避する必要があります。
この特定の例は、distinctUntilChanged を削除し、入力が変更されていない場合に前の結果を通過するように不安定な scan() 関数を作成することで回避できます。次に、combineLatest を使用する代わりに、結果を圧縮できます。不器用ですが、実行可能です。
ただし、どこかに ajax 呼び出しなどの非同期性がある場合、zip は機能しません。ajax 呼び出しは同期 (キャッシュされている場合) または非同期で完了するため、zip は使用できません。
編集
より簡単な例で望ましい動作を明確にしようとしています:
a と b の 2 つのストリームがあります。b は a に依存します。b は非同期ですが、ブラウザはそれをキャッシュする可能性があるため、a とは独立して更新することも、a と同時に更新することもできます。したがって、ブラウザ内の特定のイベントによって、次の 3 つのいずれかが発生する可能性があります。b 更新; a と b の両方を更新します。望ましい動作は、コールバック (たとえば、render メソッド) を 3 つのケースすべてで 1 回だけ呼び出すことです。
a または b が単独で発火すると、zip からコールバックが得られないため、zip は機能しません。a と b が同時に起動すると、2 つのコールバックが発生するため、combineLatest は機能しません。
reactive-extensions-js - RxJS Observable を配列に集める
RxJS を使用して、非同期のイベントの世界を同期の世界と「橋渡し」したいと考えています。具体的には、ある時間間隔で収集されたイベントの配列を返す関数を作成したいと考えています。
私が望むことをするObservableを作成できます
正しい値をうまく印刷できます
これは印刷します
しかし、私が望むのは、この配列を変数に割り当てることです。概念的には、次のようなものが必要です
var collectedDuringSecond = source.toPromise.getValue()
getValue がブロックされるため、上記の行が完了した後、collectedDuringSecond には [0,1,2,3,4,5,6,7,8] が含まれます。
reactive-extensions-js - RxJS 可変長ウィンドウ
windowWithMaxCount のように機能しますが、ウィンドウ サイズは 1 から maxCount に変更されます。
私がやっていることは、イベントの c ストリームに基づいて折れ線グラフを描画することです。折れ線グラフには、たとえば 50 ポイントの配列が必要です。新しいポイントが到着したら、右側に 1 つのポイントを押し出し、この新しいポイントを左側に配置する必要があります。
したがって、一般的に observable.windowWithCount(50,1) はまさにそれを行います。最初のウィンドウで、50 個の要素すべてが利用可能になるまで待たなければならないという唯一の問題。この間、ユーザーの画面には何も表示されません。
代わりに、最初のポイントが到着するとすぐに、サイズ 1 のウィンドウを取得し、次にサイズ 2 のウィンドウを取得し、サイズ 50 (maxCount) のウィンドウに到達するまで続けます。この時点で、後続のすべてのウィンドウのサイズは 50 になります。
画面上の効果は、画面全体を感じるまで、画面を左から右に塗りつぶす行になります。
observable - 次の値を遅らせる Observable を作成する
写真のようにRxJSを使用してオブザーバブルを作成しようとしています。
- 値を取得し、一定時間待機してから次の値を取得します。
- 次のものは、残りをスキップして、待機期間中に発行された最後の値になります。
- 値が発行されなかった場所で待機間隔が過ぎた場合、画像の最後の例が示すように、次の値をすぐに取得する必要があります。