14

長い間、私は RX に頭を悩ませようとしています。そして、本当のことを言うと、私はそれを手に入れたかどうか確信が持てません.

今日、http://reactive-extensions.github.com/RxJS/で説明を見つけました-私の意見では-これは恐ろしいものです。それは言います:

RxJS はイベントに対するものであり、promise は非同期に対するものです。

偉大な。これは非常に複雑な文であり、RX が何であるかを少しでも理解していない場合、その文の後には前と同じように頭が悪くなります。

そして、これは基本的に私の問題です: RX に関する通常の場所にあるすべての説明は、(少なくとも私は) ばかげているように感じます。彼らはRXを非常に複雑な言葉や用語などをたくさん使った非常に洗練された概念として説明していますが、私はそれが何についてのものなのかよくわかりません.

私の質問は次のとおりです。RX を 5 歳の人にどのように説明しますか? それが何であるか、何に役立つか、そしてその主な概念は何かについて、明確で絵のように美しい説明が欲しいですか?

4

2 に答える 2

37

したがって、LINQ (JavaScript では、これらは 、 、 などの高レベルの配列メソッドmapですfilter。C reduce# 開発者でない場合は、「LINQ」について言及するたびに置き換えてください) は、適用できるツールの束を提供します。シーケンス(大雑把な意味での「リスト」)。入力をフィルタリングして出力 (別名「私にとって実際に興味深いリスト」) に変換します。しかし、リストとは何ですか?

リストとは

リストは、特定の順序でいくつかの要素です。LINQ を使用すると、任意のリストをより適切なリストに変換できます。

(必ずしもソートされた順序ではなく、順序です)。

イベントはリストです

しかし、イベントはどうですか?イベントにサブスクライブしましょう:

OnKeyUp += (o,e) => Console.WriteLine(e.Key)
>>> 'H'
>>> 'e'
>>> 'l'
>>> 'l'
>>> 'o'

うーん。これは、特定の順序でいくつかのように見えます。リストとイベントは同じものです。

リストとイベントが同じ場合....

...では、入力イベントより興味深いイベントに変換およびフィルター処理できないのはなぜですか。それがRxです。Select、Where、Aggregate などのすべての LINQ 演算子を含め、シーケンスの処理について知っていることをすべて取り入れて、それらをイベントに適用します。

簡単です。

コールバックもシーケンスです

コールバックは基本的に一度だけ発生するイベントではありませんか? 基本的には、アイテムが 1 つのリストのようなものではないでしょうか。Rx の興味深い点の 1 つは、イベントとコールバック (および Geolocation 要求など) を同じ言語で処理できることです (つまり、2 つを組み合わせたり、どちらか一方を待つことができます)。など)。

于 2013-02-22T23:10:35.467 に答える
16

Paul の優れた回答に加えて、データのプルとプッシュの概念を追加したいと思います。

パイプライン

一連の数値を生成し、結果を出力するコードの例を見てみましょう。これをストリームと考えると、一方producerでは新しい数値を作成する があり、もう一方にconsumerはそれらの数値で何かを行う があります。

プル - 素数リスト

producerが素数のリストを生成しているとしましょう。通常、数値のリストを生成する関数があり、それが返されるたびに、パイプを介して計算した次の値を にプッシュし、consumerその数値を画面に出力します。

Prime Generator ---> Console.WriteLine

producerこのシナリオでは、がほとんどの作業を行っており、が次の値を送信するconsumerのを待っていることが簡単にわかります。producerはパイプラインをプルしており、 が次の値を返すのを待ってconsumerますproducer

プッシュ - 高速プロセスからの進捗率イベント (リアクティブ)

1,000,000 個のアイテムを処理する関数があるとします。各アイテムの処理には数ミリ秒かかり、関数は到達距離のパーセンテージ値を返します。とても多くの進捗値があり、非常に高速です。

パイプラインの反対側には進行状況バーがあります。プログレス バーがすべての更新を処理する場合、UI は値のストリームに追いつくのをブロックします。

100 万アイテム プロセッサ ---> プログレス バー

このシナリオでは、データがによってパイプラインを介してプッシュされ、処理するにはあまりにも多くのデータがプッシュproducerされるため、がブロックされます。consumer

Reactive を使用するとconsume、データの処理方法に応じて、遅延やウィンドウを挿入したり、パイプラインをサンプリングしたりできます。この場合、プログレス バーを更新する前に毎秒データをサンプリングします。

リストとイベント

したがって、リストとイベントはちょっと同じです。違いは、データがシステムを介してプルされるかプッシュされるかです。リストを使用すると、データがプルされます。イベントにより、データがプッシュされます。

于 2013-02-23T02:17:09.203 に答える