web-dev-qa-db-ja.com

オブザーバブルではなくPromiseを使用する場合

観測可能と比較してプロミスがより強力なケースはありますか?オブザーバブルの約束よりも多くの利点を知っています。しかし、何らかのケースがありますが、私はオブザーバブルについての約束のみを使用するべきです。

私はこのリンクを見つけました promises vs observables 。しかし、これは常に約束よりもオブザーバブルの利点を示しています。オブザーバブルよりも約束のメリットを知りたい。

11
Nimish goel

オブザーバブルは、promiseが行うすべてのことを実行します。 promiseが期待される場合は、toPromise()メソッドを使用していつでもpromiseに切り替えることができます。

オブザーバブルは、次の場合にプロミスよりも選択する必要があります

  • オブザーバブルに固有であり、約束ではなく、 関連する質問 で詳細に説明されている機能はすべて需要があります(特に、サブスクリプション解除、不完全なオブザーバブル、および複数の値を受け取るオブザーバブル)
  • それを消費するAPIはオブザーバブルを期待し、オブザーバブルとプロミスを統合するためにObservable.from(...)安全構造を使用しません

オブザーバブルmayは、それが使用されているコードがオブザーバブルを排他的に使用する場合、promiseよりも選択されます。

プロミスmustは、それを消費するAPIがプロミスを期待し、Observable.from(...)安全構造を使用しない場合、オブザーバブルよりも選択できます。

以下の場合、オブザーバブルよりプロミスmayを選択できます。

  • それが使用されているコードはプロミスを排他的に使用します(特にasync関数)
  • 設計により非同期である必要があります
  • オブザーバブルlet observable = ...; observable.subscribe(...); return observableでチェーンを解除する必要があるため、すぐにサブスクライブしてチェーンしてからにする必要があります(これには、複数のサブスクリプションも必要ですオブザーバブルがキャンセル可能な場合に追跡される)
9
Estus Flask

以下の場合、Observableの代わりにPromiseを使用します。

  • あなたは(将来の応答)イベントを処理する必要があります(サブスクリプションなし、キャンセルなし:サブスクライブ後、100%の回答があり、100%のコードを処理する必要がありますwill実行されます)
  • 1つのサブスクリプション= 1つのイベント処理:ソースからのイベントは1つだけなので、将来の応答と完了は同じイベントです。

次の場合、Promiseの代わりにObservableを使用します。

  • 同じソースからの複数のイベントを受け入れる機能が必要な場合
  • 「このイベントストリームは終了しました」ハンドラが必要です
  • 終わることのないデータストリームからサブスクライブを解除し、いつでも再サブスクライブできるようにしたい場合(つまり、サブスクリプションを実行する必要がない場合もあります。たとえば、10秒以内に何も起こらない場合は、退会、誰もこれまでの遅い答えを処理しません)
  • RxJSの「ストリームAPI」を使用して、応答のデータを前処理したいとします。

一般に、Observableパターンは拡張されたPromiseパターンであり、より多くのツールと機能を備えています。 Promiseでコードを制限するかどうかは、あなた次第です。最初はカスタムライブラリでしたが、次に ES2016 に含まれました。

また、特定の問題パラメーターを使用して問題を調査することをお勧めします。アプリを高速化する必要がありますか?レガシーモジュールを使用しますか?

7
ForestG

From:Randall Koutnikの本「RxJSでリアクティブウェブサイトを構築する」。 :

Observablesは、arraysのように、イベントのコレクションですが、約束にも似ていますasynchronous:コレクション内の各イベントは、将来の不確定なポイントに到着します。これは、promisesのコレクション(-===-)(Promise.allなど)とは異なり、observableは、任意の数のイベント、および約束追跡できるのは1つだけです。 observableを使用して、ボタンのクリックをモデル化できます。これは、アプリケーションの存続期間中に発生するすべてのクリックを表していますが、クリックは将来のある時点で発生し、予測できません。

From:アントンモイセーエフブック「TypeScriptによる角度開発、第2版」 :

Promiseには次の欠点があります。

promiseで行われた保留中のリクエストをキャンセルする方法はありません。

約束が解決または拒否されると、クライアントはデータまたはエラーメッセージを受信しますが、どちらの場合も1つのデータになります。 JavaScriptpromiseは、長期にわたって配信されるデータチャンクの連続ストリームを処理する方法を提供していません。

Observablesにはこれらの欠点はありません。

1
H S Progr

約束は熱心なので、トリガーなしですぐに何かを実行したい場合に使用します。一方Observableはレイジーです。これは、入力などからのトリガーを必要とし、アプリが読み込まれるとすぐに発生する必要がないものに使用できます。

1
Vipul

Observable is lazy->オブザーバブルをサブスクライブするまで何も起こりません。 Observableは、メモリのクリーンアップのために登録を解除することでいつでもキャンセルできます。 Promiseは1つの応答しか持てませんが、observableは複数の応答を持つことができます。

const promSingle = new Promise(resolve){
  resolve('a');
  resolve('b');
}
promSingle.then(value => {
  console.log(value)
})

In Observableのみを印刷します。

const obSerMult = new Observable(observable){
  Observable.next('a');
  Observable.next('b');
  Observable.next('c');
  Observable.next('d');
}

obSerMult.subscribe(value => {
  console.log(value);
})
print will be a, b , c ,d
0
ramesh