2016-03-17 18 views
25

だから私は観測が今後のJavaScriptのMVCののいくつかで使用量の面で約束を追い抜くために探していることを読んだ:JavaScriptの観測値と約束の違いは何ですか?

観測との約束の違いは何ですか?

更新日:謝罪!私の虚偽の声明を削除しました。

+3

を使用する必要があります要求取り消し - 新しい要求のチェーンを持っている場合、あなたはどこのソースを共有する気にしてくださいあなたはこれを読む?私は個人的に、仕様から既に削除された、Objectives.observe以外のオブザーバブルについては聞いたことがありません。 – nem035

+0

または[Proxies]について話していますか(https://developer.mozilla.org/en -US/docs/Web/JavaScript/Reference/Global_Objects/Proxy)? – JCOC611

+1

プロミス:単一値、非同期。 Observable:コレクション、非同期。 Observable proposalの実装としてhttp://reactivex.io/intro.htmlを参照してください。 –

答えて

26

オブザーバブルと約束の違いは何ですか?

は、簡単に言えば:約束に、非同期 単一値に観測可能な解決さを解消します(または放出) 複数の値を非同期的に(時間の経過)。

具体例:

  • 約束:Ajax呼び出しからの応答
  • 観察可能:http://reactivex.io/intro.html

    私がしました:詳しい情報はここで見つけることができるイベント

をクリックします観察者が約束を克服しようとしていることを読む。

そう思わない。 Observablesは特定の問題に対するより優れた解決策かもしれませんが、それは(それが意味するところでは)旧約を廃止するものではありません。

+3

Woah、それはまったく大きな違いではありません。エラー処理、スケジューリング、およびモデルに関して大きな違いがあります。約束は単一の価値_であり、観察可能なものは複数の価値を生み出すために呼び出される_関数のようなものです。約束は常にキャッシュされ、マルチキャストされます - 観測可能なのはユニキャストです。 ajax呼び出しの監視対象に2つのサブスクライバがある場合(コンバイナが使用されていない限り)、個別のHTTP呼び出しが作成されます。 –

+3

@BenjaminGruenbaum私はこの答えが主な違いになり、あなたのコメントがニュアンスを示していると言うのは公正だと思います。 –

31

約束は将来の1つの価値を表すものです。 オブザーバブルは、無限の可能性のある値を表します。

プロミスは作成時に即座にその値のフェッチをトリガーします。 Observableは、購読すると値の生成を開始します。 (それが熱く観測可能でない限り、この質問の範囲外です)

約束はAJAX呼び出しを表すように設計されています。

21

約束はRxは非同期プログラミングの上に強力な抽象化を提供していますように非常に単純なコールバックメカニズムを、提供などのデータベース、AJAX呼び出しからのデータを、(おそらく無限の)配列、からのイベント、データ: 観測は何かを表現するために設計されています。 Observableは一連のデータを表し、受信データをどのように扱うべきかを定義するために演算子を適用することができます。

HTTPリクエストを作成してからUIコンポーネントを更新するだけであれば、Promiseを使用すれば十分です。

しかし、ほとんどのアプリはそれよりも複雑なニーズがあります(最初のアプリでは明白ではないとしても)。例えば、私たちのHTTPリクエストを見てみると、これをObservableとしてモデル化し、Rx演算子のいくつかを使ってどのように役立つのかを見てみましょう:

- HTTP要求がユーザアクションによってトリガされた場合、複数のHTTPリクエストをオフにします(ユーザーが検索ボックスに入力したとします)。私たちはすべてのキーストロークに対して要求を発したくないので、スロットルの検索が必要な場合があります。ユーザーが300msの入力を止めた場合にのみリクエストが発生します。さらに、ユーザーが単語を入力して300ms待って別の文字を追加すると、後続のHTTPリクエストが起動します。約束では、我々は応答を受け取る順序を制御できず、古い要求を取り消すことができないため、おそらく競合状態に遭遇するだろう。 Rxはスイッチの間でと呼ぶことによってこれを解決します。私たちがもう気にしていない古いリクエストの購読にはを廃棄してください。例えば、のような無効な検索入力を除外することもできます。の検索語は3文字未満です。

- タイムアウト/エラー処理をサポートします。私たちのHTTPリクエストが失敗したとしましょう、Rxは簡単にを再試行できます。をリクエストしてください。

- 私たちのアプリケーションのいくつかの部分が同じHTTP呼び出しをする必要があるとしましょう。おそらく、実際に何度も呼び出しをしたくないとしましょう。複数の消費者に観測値を公開し、リプレイを使用して、コールが1回行われ、結果が後続のサブスクライバにキャッシュされるようにすることができます。 TimeSpanをReplayに供給して、キャッシュの動作が満了するようにすることもできます。

- スケジューラを使用したスレッド化による強力な抽象化により、並行性を制御できます。さらに、ユニットテストのテストスケジューラを使用して時間を制御し、タイムアウト、競合状態などをシミュレートすることができます。

可能なことを示す簡単な例です。 Rxフレームワークには、あらゆる種類のシナリオに対応するための演算子が数多くあり、Rxの合成は、演算子を簡単に組み合わせて必要な動作を定義できることを意味します。独自の再利用可能な演算子(RetryAfterDelayなど)も簡単に作成できます。

要約すると、RxはPromisesよりもはるかに多くを行うことができます。私は、今後数年間、Promisesの代わりにRxに向かって継続的なシフトが起こると考えています。

詳細については、のObservablesセクションをご覧ください。

6

の約束への変換Angular 2 guid

に言ったようにあなたは、単一のデータチャンクを取得したい場合によく適しています。あなたがデータを受け取ったら、あなたは完了です。

しかし、要求が必ずしも1回しか行われない場合もあります。サーバーが最初の要求に応答した後で、サーバーが に応答する前に、1つの要求を開始し、取り消し、別の要求を行うことができます。

たとえば検索コンポーネントでユーザーが検索ボックスに名前を入力すると、その検索クエリで繰り返しHTTPリクエストが行われます。

約束ではあるが、Observablesで簡単に要求をキャンセルする新しい要求シーケンスを実装することは困難です。

ので、あなたのコンポーネントが一つだけの要求でデータを取得する場合、それはPromiseを使用するのは良い選択ですが、それはあなたがobservable

関連する問題