問題タブ [kefir.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 - Kefir を使用して複数のイベントでプロパティを変更する慣用的な方法
複数のイベント タイプに応じて変化するプロパティを Kefir で作成する慣用的な方法は何ですか?
私のプロジェクトではrxjs
、FRP スタイルのアプリケーションに使用することから始めました。このアプリケーションでは、複数の変数に応じて変化する状態をサブスクライブしたいと考えました。これは私がそれを機能させた方法です:
これはおそらくベスト プラクティスではないことがわかりました。また、オブザーバーを複数のソースにサブスクライブすることは実際には正しくないこともわかりました。
多くの理由から、RxJs とは異なるライブラリーを試すことにしました。現在、ドキュメントが充実しており、パフォーマンスが優れていると思われる Kefir を評価しています。しかし、イベントタイプを検査する必要がある醜いハックを除けば、自分がやりたいことを行う方法を決定するのはさらに難しいと感じています:
一連の変更を作成するために、一連のイベント タイプに対して大きな条件付きブロックを使用するなどの洗練されていない手法を使用する必要はありません。
Bacon.js を使用する予定はありませんが、まさに必要なものが含まれていることがわかります。
標準演算子を使用して Kefir でこの種のことを行う自然な方法はありますか、それとも自分で実装する必要があるのでしょうか?
javascript - Highland.js、Kefir.js、Rx.js の違いは何ですか?
SO では主観的な回答は避けるべきなので、具体的に質問します。これらの 3 つの機能的/反応的なライブラリの機能的および/またはパフォーマンスの違いは何ですか? BaconJS は jQuery に依存しているため、削除しました。私は JS ストリームに慣れていないので、最初は NodeJS で、次に AngularJS のコンテキストでそれらに慣れることに主な関心があります。他のものよりもこれらのいずれかを選択した場合、選択につながる基準は何ですか?
node.js - Kefir/Bacon.js でのストリーム処理
私は Kefir (または Bacon.js、お気に入りを選んでください) を使用してリアルタイム データを含む個人的なプロジェクトに取り組んでおり、データをデータベースに記録して ID を追加し、オブジェクトを渡す必要があるところまで来ました。チェーンの id を使用します。実際にデータベース (NeDB) にデータを挿入することは問題ではなく、レコードがデータベースに挿入されている間、コールバックを使用して実行を継続し、この動作を回避する方法です。
非常に単純化された例:
解析されたデータをバス/プールにダンプするデバイスがいくつかあるとします。
これはマップ機能の不適切または不適切な使用であると思われますが、いくつかのことを試した後、アイデアが出てきました。ご意見、ご提案、またはヘルプをいただければ幸いです。
私の解決策
(すでに行ったことに加えて)さらに多くの読書と実験を行い、日常的にストリーム処理を行っていた日々に戻った後、次の解決策を思いつきました。これは最も効率的ではないかもしれませんが、このソリューションでは、複数のイベント ソースをデータ プール (図示せず) にプラグインすることで、複数のソースから入力を受け取ります。オブジェクト/データに対して単一の操作を実行するために、まったく新しいストリームが作成されます。ここでは拡張性が目的ではありませんでしたが、これにより、複数のソースがストリームからデータをフィルターに直接ダンプするのではなく、監視できるようになります。最後に、処理されたストリームからのデータがフィルタリングされ、必要な結果のみが表示されます。
kefir.js - Kefir で終わるストリームを配信するには、リスナーのサブスクライブを解除する必要がありますか?
Bacon.noMore
サブスクライバーに戻ってサブスクライブを解除できるため、これは問題ではない BaconJS から移動しています。Kefir では、サブスクライブ解除はより定型的なものなので、自然な質問は --- ストリームが終了した場合、リスナー (別名コールバック) のサブスクライブを解除する必要がありますか、それとも Kefir はそれを自動的に処理しますか?
rxjs - 関数型リアクティブプログラミングでストリームを無視/キャンセル/中断しますか?
別のストリームの出力に基づいてストリームをキャンセル/無視/中断する方法はありますか?
ユースケースは、3 つのストリームがあることです。
- loginStream - ユーザーがログイン資格情報を入力し、送信をクリックします。ログイン資格情報を発行します。
- authorizeStream- システムはユーザーの承認を試みます。トークンを発行します。
- logoutStream - ユーザーがログアウト ボタンを押す
一般的なケースは、ユーザーがログインし、システムが認証を試み、将来のある時点でユーザーがログアウトするというものです。ごく普通のFRPです。
エッジ ケースは、ユーザーがログインしても、承認される前にすぐにログアウトする場合です。
システムが異常な状態にならないようにするために、この特定のケースでは承認ストリームを無視する必要があります。私が考えることができる唯一のことは、(1) 3 つのストリームをマージする、(2) スキャンを介して状態を追跡する、(3) ログアウトで状態をlogout
に設定し、ログインで状態を に設定することlogin
です。にないときに許可イベントを除外しlogin
ます。
上記のアプローチは機能するはずですが、authorizationStream を無視する、よりクリーンで「より FRP」な方法があるかどうか疑問に思っています。
javascript - リアクティブプログラミングの方法で ENTER が押されるまで、すべてのキー入力をキャプチャします
ENTER
Javascript と Kefir を使用して、ヒットするまですべてのキー入力をキャプチャしたいと思います。これまでのところ、私はbufferWhile
likeを使用してこれを行うことができました
scan
しかし、最初は通常のように使用したかった
しかし、どうすればいいですか:
ENTER
ヒット時にアキュムレータを出力しますか?- アキュムレータを再起動して、新しいキーストローク シーケンスを開始しますか?
基本的に、単一のストリームbufferWhile
を使用してどのように構成しますか? scan
答えは特に Kefir に関するものである必要はありませんが、FRP 疑似コードであれば何でもかまいません。