この記事は、Florian RapplとMoritzKrögerによってレビューされました。 SetePointのコンテンツを完璧にしてくれたSetePointのすべてのピアレビューアに感謝します!
機能的反応性プログラミング(FRP)への関心が高まるにつれて、RXJSはこのパラダイムで最も人気のあるJavaScriptライブラリの1つになりました。この記事では、RXJSのトップ10の必見関数を調べます。
注:この記事では、RXJSの基本に精通していると想定しています。これは、「RXJSとの機能的な反応性プログラミングから始まる」という記事で説明されています。
map()
、filter()
、reduce()
、take()
などのRXJの単純なストリームのコア操作は、ミラーアレイ操作ですが、時間の経過とともに値を発する数値のストリームに適用されます。 flatMap()
やswitch()
などの特別な関数は、複雑なデータ構造を処理し、複数のストリームを個別に管理するために重要であり、高度なリアクティブプログラミングタスクに重要です。 concat()
、merge()
などの演算子を使用して、複数のストリームを効果的に組み合わせることができ、それぞれがストリーム管理とデータの同期に異なる役割を果たします。 combineLatest()
takeUntil()
ストリーム - またはRXJS Jargonの観察可能なオブジェクト - イベントリスナーのように:どちらも何かが起こるのを待ち、それが起こったときにあなたに通知します。 OnClickリスナーから取得した一連の非同期通知は、データフローの完璧な例です。
言い換えれば、観察可能なオブジェクトは、時間の経過とともに充填された配列にすぎません。
この配列の要素は、ファイルシステム、DOMイベント、API呼び出し、さらには配列などの変換された同期データなど、ほぼどこからでも届きます。基本的に、リアクティブプログラミングは、観察可能なオブジェクトをプログラムの構成要素として使用することに過ぎません。
配列との関係
明示的に変更されていない限り、コンテンツが最終的なため、ストリームと配列の関係は非常に深いため、ほとんどの反応性拡張は、リスト操作がコアである機能プログラミングの世界に由来します。
一般的なTo Doアプリを検討してください。 rxjsを使用してユーザーの未完成のタスクの名前を表示する方法の質問を見てみましょう:
const task_stream = // 创建所有数据库中任务的流 getTasks(). // 只获取此用户的任务 filter((task) => task.user_id == user_id). // 获取未完成的任务 filter((task) => !task.completed). // 只获取任务名称 map((task) => task.name) /* 任务如下所示: task = { user_id : number, completed : boolean, name : string } */
これまでのところ、これは単なる配列拡張機能ですが、リアクティブプログラミングの機能スタイルを示しています。
宣言的な性質は、より複雑な「現実世界」関数を追加することで明らかになります。必要だと仮定します:
const task_stream = parameter_stream. debounce(1000). map((parameter) => { getTasks(). retry(3). filter((task) => task.user_id === user_id). filter((task) => task.completed === parameter). map((task) => task.name) }). flatMap(Rx.Observable.from). distinctUntilChanged(). update()
parameter_streamは、ユーザーが完了したか、未完成のタスクをパラメーターに保存したいかを示します
debounce()は、最後のボタンクリックにのみ焦点を合わせてください
RXJSのトップ10の必須関数を閲覧するプロセスでは、上記の例でそれぞれの関数に遭遇します。
reduce()
take()とtakhlime()とは別に、これらはJavaScriptの高次配列関数に似ています。
元の配列の各要素が、コールバックによって生成された結果に置き換えられる新しい配列を返します。
観察可能なオブジェクトでmap()を使用する場合の唯一の違いは次のとおりです。
新しい配列ではなく、新しい観測可能なオブジェクトを返します
Map()を使用して、ユーザーデータストリームをWebサイト名のみを含むリストに変換できます。
const task_stream = // 创建所有数据库中任务的流 getTasks(). // 只获取此用户的任务 filter((task) => task.user_id == user_id). // 获取未完成的任务 filter((task) => !task.completed). // 只获取任务名称 map((task) => task.name) /* 任务如下所示: task = { user_id : number, completed : boolean, name : string } */
ここでは、MAPを使用して、各ユーザーのWebサイトに着信ストリーム内の各ユーザーオブジェクトを置き換えます。
また、rxjsでは、map()をselect()として呼び出すこともできます。どちらの名前も同じ関数を指します。
const task_stream = parameter_stream. debounce(1000). map((parameter) => { getTasks(). retry(3). filter((task) => task.user_id === user_id). filter((task) => task.completed === parameter). map((task) => task.name) }). flatMap(Rx.Observable.from). distinctUntilChanged(). update()
filter()には、where()もあります。
3を使用して結果を収集します
resid()は、多くの場合、最も混乱する基本リスト操作です。これは、filter()またはmap()とは異なり、その動作は使用によって異なるためです。
通常、reduce()は値のコレクションを取り、それらを単一のデータポイントに変換します。この例では、Webサイト名のStreamを提供し、Rediving()を使用して、そのストリームを、見つけたWebサイトの数とその名前の長さの合計を計算するオブジェクトに変換します。
ここでは、ストリームを単一のオブジェクトに簡素化します。
source. map((user) => user.website)
見たサイトの数 すべての名前の総長さ
。(n)ストリームからn値を読み取り、登録解除します。
rxjsは、特定のブールテストが確立される前に値を取得できるTakewhile()も提供します。 Takewhile()を使用して、上記のストリームを次のように記述できます。
高次フロー操作
source. map((user) => user.website). filter((website) => (website.endsWith('net') || website.endsWith('org')); })
source. map((user) => user.website). filter((website) => (website.endsWith('net') || website.endsWith('org'))). reduce((data, website) => { return { count : data.count += 1, name_length : data.name_length += website.length } }, { count : 0, name_length : 0 })
5を使用して移行を押します
…実際、私たちはすでにそれを使用しています!ソースストリームを定義するとき、frompromise()とflatmap()を呼び出します:
これは、3つの新しいメカニズムを使用します:
frompromise;
rx.observable.from;フラットマップ。
source. map((user) => user.website). filter((website) => (website.endsWith('net') || website.endsWith('org'))). scan((data, website) => { return { count : data.count += 1, name_length : data.name_length += website.length } }, { count : 0, name_length : 0 }). take(2);
約束は、非同期に取得する単一の将来の価値を表しています。たとえば、サーバーへの呼び出しの結果です。
これは、rx.observable.frompromise()を使用すると、単一の値を発する観察可能なオブジェクトを取得することを意味します。
約束する値
約束の拒否価値。flatmap()を使用する場合、we:
単一の価値の解像度または約束の拒否を発行する観察可能なオブジェクトにflatmap()を呼び出します
関数を渡して、新しい観測可能なオブジェクトを作成します。
複数のストリームを組み合わせた
const task_stream = // 创建所有数据库中任务的流 getTasks(). // 只获取此用户的任务 filter((task) => task.user_id == user_id). // 获取未完成的任务 filter((task) => !task.completed). // 只获取任务名称 map((task) => task.name) /* 任务如下所示: task = { user_id : number, completed : boolean, name : string } */
通常、結合する必要がある複数のストリームがあります。ストリームを組み合わせる方法はたくさんありますが、他のストリームよりも頻繁に表示されるものもあります。
const task_stream = parameter_stream. debounce(1000). map((parameter) => { getTasks(). retry(3). filter((task) => task.user_id === user_id). filter((task) => task.completed === parameter). map((task) => task.name) }). flatMap(Rx.Observable.from). distinctUntilChanged(). update()
接続とマージは、ストリームを結合する最も一般的な2つの方法です。
MERGEは、アクティブストリームの値を放出することにより、複数のストリームから新しいストリームを作成します
concat()ストリームは、最初にSource1のすべての値を印刷し、Source1が終了した後にのみSource2の値の印刷を開始します。
merge()ストリームは、受信した順序に従ってsource1とsource2の値を印刷します。2番目のストリームの値を発する前に、最初のストリームが完了するのを待ちません。
8を使用します
通常、観察可能なオブジェクトを放出するが、ソースからの最新の排出量にのみ焦点を当てる観察可能なオブジェクトを聞きたいと考えています。source. map((user) => user.website)
この目的のために、RXJSはスイッチを提供します。
ユーザーインターフェイスは、switch()にいくつかの適切なユースケースを提供します。ユーザーが検索したいものを選択するたびにアプリケーションがリクエストを行うと、最新選択の結果を確認したいだけであると仮定できます。したがって、Switch()を使用して、最新の選択結果のみをリッスンします。
ちなみに、帯域幅を無駄にしないようにし、ユーザーが最後に毎秒行うときのみサーバーへのアクセスを選択するようにする必要があります。これに使用する関数は、debounce()
と呼ばれます反対方向に進み、最初の選択肢に従う場合のみを使用する場合は、Throttle()を使用できます。同じAPIを持っていますが、反対に動作します。
デモンストレーションでは、別のドロップダウンメニューを作成し、ユーザーが取得するアイテムのIDを選択できるようにします。
2つの状況があります。ユーザーの場合:
ユーザーのエンドポイントの選択
最近ユーザーが選択したID。ストリームが値を放出するたびに、combineLatest()はエミスト値を取得し、他のストリームから放出された最後のアイテムとペアをペアにペアにペアに合わせます。
これは、チャートで視覚化するのが簡単です:
const task_stream = // 创建所有数据库中任务的流 getTasks(). // 只获取此用户的任务 filter((task) => task.user_id == user_id). // 获取未完成的任务 filter((task) => !task.completed). // 只获取任务名称 map((task) => task.name) /* 任务如下所示: task = { user_id : number, completed : boolean, name : string } */
zipを使用して、2つのストリームの変更のみに応答します
では、ユーザーがIDとエンドポイントフィールドの選択を更新するまで待って、combinElatest()をzip()に置き換えます。
const task_stream = parameter_stream. debounce(1000). map((parameter) => { getTasks(). retry(3). filter((task) => task.user_id === user_id). filter((task) => task.completed === parameter). map((task) => task.name) }). flatMap(Rx.Observable.from). distinctUntilChanged(). update()
combineLatest()とは異なり、zip()は、両方の観察可能なオブジェクトが更新された値の配列を送信する前に新しいコンテンツを発するまで待ちます。
10
最後に、Takeuntil()を使用すると、2番目のストリームが値を発し始めるまで、最初のストリームを聞くことができます。source. map((user) => user.website)
これは、ストリームを調整する必要があるが、それらを結合する必要がない場合に役立ちます。
アレイに時間寸法を追加するだけで、プログラムについての新しい思考への扉が開きます。
source. map((user) => user.website). filter((website) => (website.endsWith('net') || website.endsWith('org')); })
rxjsはここで見られるものよりもはるかに多くですが、それは長い道のりを歩むのに十分です。
に関する
RXJSは、非同期またはコールバックベースのコードの組み合わせを簡素化するために、観察可能なオブジェクトを使用したリアクティブプログラミングライブラリです。これは、より必須のプログラミングスタイルで従来のJavaScriptを使用することと比較されます。重要な違いは、データの処理方法です。RXJSはデータをストリームとして扱います。これは、さまざまな演算子を使用して動作および変換できます。
RXJSの主要な演算子とそれらの仕組みは何ですか?
const task_stream = // 创建所有数据库中任务的流 getTasks(). // 只获取此用户的任务 filter((task) => task.user_id == user_id). // 获取未完成的任务 filter((task) => !task.completed). // 只获取任务名称 map((task) => task.name) /* 任务如下所示: task = { user_id : number, completed : boolean, name : string } */
RXJのエラーを処理する方法は?
RXJの観測可能なオブジェクトのサブスクリプションをキャンセルする方法は?
中程度の加熱可能なオブジェクトと冷たい観測可能なオブジェクトの違いは何ですか?
const task_stream = parameter_stream. debounce(1000). map((parameter) => { getTasks(). retry(3). filter((task) => task.user_id === user_id). filter((task) => task.completed === parameter). map((task) => task.name) }). flatMap(Rx.Observable.from). distinctUntilChanged(). update()
RXJで複数の観測可能なオブジェクトを組み合わせる方法は?
RXJSのテーマの目的は何ですか?
angularでrxjsを使用する方法は?
RXJの一般的なユースケースは何ですか?
以上が10の知識が必要なRXJSは、例を使用して機能しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。