私はこれを行っていました ブログ とObservablesについて読むために、ObservableとSubjectの違いを理解できませんでした
ストリームプログラミングには、2つの主要なインターフェイスがあります:ObservableおよびObserver。
Observableはコンシューマ向けで、変換およびサブスクライブできます。
observable.map(x => ...).filter(x => ...).subscribe(x => ...)
Observerは、監視可能なソースにフィードするために使用されるインターフェイスです。
observer.next(newItem)
新しいObservableをObserverで作成できます:
var observable = Observable.create(observer => {
observer.next('first');
observer.next('second');
...
});
observable.map(x => ...).filter(x => ...).subscribe(x => ...)
または、ObservableとObserverの両方のインターフェイスを実装するSubjectを使用できます。
var source = new Subject();
source.map(x => ...).filter(x => ...).subscribe(x => ...)
source.next('first')
source.next('second')
Rxjsドキュメントを参照してください(詳細と例): http://reactivex.io/rxjs/manual/overview.html#subject
サブジェクトとは何ですか? RxJSサブジェクトは、値を多くのオブザーバーにマルチキャストできるようにする特別なタイプのObservableです。プレーンなObservableはユニキャストですが(サブスクライブされた各ObserverはObservableの独立した実行を所有します)、サブジェクトはマルチキャストです。
SubjectはObservableに似ていますが、多くのObserverにマルチキャストできます。サブジェクトはEventEmittersのようなものです。多くのリスナーのレジストリを管理します。
およびコード、Subject
拡張Observable
: https://github.com/ReactiveX/rxjs/blob/master/src/internal/Subject.ts#L22
/**
* @class Subject<T>
*/
export class Subject<T> extends Observable<T> implements SubscriptionLike {
//...
}
別の観点から、ObservableへのサブスクリプションがObservable関数を再実行することに注意するのは良いことです。たとえば、データソースがサービスの場合、これによりパフォーマンスの問題が発生する可能性があります。
複数のサブスクライバーに同じ値を取得する場合は、Subjectが必要になる場合があります。このため、サブスクリプションが設定されていることを確認してくださいbeforeデータソースにサブスクライブされているサブジェクト。そうしないと、プロセスがスタックします。
詳細はこちら: https://javascript.tutorialhorizon.com/2017/03/23/rxjs-subject-vs-observable/
Observableは1人のオブザーバーにしか通知できませんが、Subjectは複数のオブザーバーに通知できます。
観測可能
彼らは冷たく、少なくとも1人のオブザーバーがいるときにコードが実行されます。
データのコピーを作成:Observableは各オブザーバーのデータのコピーを作成します。
単方向:オブザーバーは値をobservable(Origin/master)に割り当てることができません。
コードは各オブザーバーに対して実行されます。 HTTP呼び出しの場合、オブザーバーごとに呼び出されます。
すべてのコンポーネント間で共有したいサービスの場合、最新の結果は得られません。すべての新しいサブスクライバーは同じオブザーバブルにサブスクライブし、ゼロから値を取得します
ユニキャストは、他のコンポーネントからではなく、オブザーバブルから値を放出できることを意味します。
被験者
それらはホットです:オブザーバーがいない場合でも、コードが実行され、値がブロードキャストされます。
データの共有:同じデータがすべてのオブザーバー間で共有されます。
双方向:オブザーバーはobservable(Origin/master)に値を割り当てることができます。
サブジェクトを使用して使用している場合、オブザーバーを作成する前にブロードキャストされるすべての値が失われます。リプレイサブジェクト
マルチキャスト、複数のサブスクライバーに値をキャストでき、サブスクライバーとエミッターの両方として機能できます