観測可能と比較してプロミスがより強力なケースはありますか?オブザーバブルの約束よりも多くの利点を知っています。しかし、何らかのケースがありますが、私はオブザーバブルについての約束のみを使用するべきです。
私はこのリンクを見つけました promises vs observables 。しかし、これは常に約束よりもオブザーバブルの利点を示しています。オブザーバブルよりも約束のメリットを知りたい。
オブザーバブルは、promiseが行うすべてのことを実行します。 promiseが期待される場合は、toPromise()
メソッドを使用していつでもpromiseに切り替えることができます。
オブザーバブルは、次の場合にプロミスよりも選択する必要があります
Observable.from(...)
安全構造を使用しませんオブザーバブルmayは、それが使用されているコードがオブザーバブルを排他的に使用する場合、promiseよりも選択されます。
プロミスmustは、それを消費するAPIがプロミスを期待し、Observable.from(...)
安全構造を使用しない場合、オブザーバブルよりも選択できます。
以下の場合、オブザーバブルよりプロミスmayを選択できます。
async
関数)let observable = ...; observable.subscribe(...); return observable
でチェーンを解除する必要があるため、すぐにサブスクライブしてチェーンしてからにする必要があります(これには、複数のサブスクリプションも必要ですオブザーバブルがキャンセル可能な場合に追跡される)以下の場合、Observableの代わりにPromiseを使用します。
次の場合、Promiseの代わりにObservableを使用します。
一般に、Observableパターンは拡張されたPromiseパターンであり、より多くのツールと機能を備えています。 Promiseでコードを制限するかどうかは、あなた次第です。最初はカスタムライブラリでしたが、次に ES2016 に含まれました。
また、特定の問題パラメーターを使用して問題を調査することをお勧めします。アプリを高速化する必要がありますか?レガシーモジュールを使用しますか?
From:Randall Koutnikの本「RxJSでリアクティブウェブサイトを構築する」。 :
Observablesは、arraysのように、イベントのコレクションですが、約束にも似ていますasynchronous:コレクション内の各イベントは、将来の不確定なポイントに到着します。これは、promisesのコレクション(-===-)(Promise.allなど)とは異なり、observableは、任意の数のイベント、および約束追跡できるのは1つだけです。 observableを使用して、ボタンのクリックをモデル化できます。これは、アプリケーションの存続期間中に発生するすべてのクリックを表していますが、クリックは将来のある時点で発生し、予測できません。
From:アントンモイセーエフブック「TypeScriptによる角度開発、第2版」 :
Promiseには次の欠点があります。
promiseで行われた保留中のリクエストをキャンセルする方法はありません。
約束が解決または拒否されると、クライアントはデータまたはエラーメッセージを受信しますが、どちらの場合も1つのデータになります。 JavaScriptpromiseは、長期にわたって配信されるデータチャンクの連続ストリームを処理する方法を提供していません。
Observablesにはこれらの欠点はありません。
約束は熱心なので、トリガーなしですぐに何かを実行したい場合に使用します。一方Observableはレイジーです。これは、入力などからのトリガーを必要とし、アプリが読み込まれるとすぐに発生する必要がないものに使用できます。
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