web-dev-qa-db-ja.com

rxjsのObservableとSubjectの違いは何ですか?

私はこれを行っていました ブログ とObservablesについて読むために、ObservableとSubjectの違いを理解できませんでした

18
Lijin Durairaj

ストリームプログラミングには、2つの主要なインターフェイスがあります:ObservableおよびObserver

Observableはコンシューマ向けで、変換およびサブスクライブできます。

observable.map(x => ...).filter(x => ...).subscribe(x => ...)

Observerは、監視可能なソースにフィードするために使用されるインターフェイスです。

observer.next(newItem)

新しいObservableObserverで作成できます:

var observable = Observable.create(observer => { 
    observer.next('first'); 
    observer.next('second'); 
    ... 
});
observable.map(x => ...).filter(x => ...).subscribe(x => ...)

または、ObservableObserverの両方のインターフェイスを実装するSubjectを使用できます。

var source = new Subject();
source.map(x => ...).filter(x => ...).subscribe(x => ...)
source.next('first')
source.next('second')
24
ZahiC

Rxjsドキュメントを参照してください(詳細と例): http://reactivex.io/rxjs/manual/overview.html#subject

サブジェクトとは何ですか? RxJSサブジェクトは、値を多くのオブザーバーにマルチキャストできるようにする特別なタイプのObservableです。プレーンなObservableはユニキャストですが(サブスクライブされた各ObserverはObservableの独立した実行を所有します)、サブジェクトはマルチキャストです。

SubjectはObservableに似ていますが、多くのObserverにマルチキャストできます。サブジェクトはEventEmittersのようなものです。多くのリスナーのレジストリを管理します。

およびコード、Subject拡張Observablehttps://github.com/ReactiveX/rxjs/blob/master/src/internal/Subject.ts#L22

/**
 * @class Subject<T>
 */
export class Subject<T> extends Observable<T> implements SubscriptionLike {
//...
}
7
John Smith

別の観点から、ObservableへのサブスクリプションがObservable関数を再実行することに注意するのは良いことです。たとえば、データソースがサービスの場合、これによりパフォーマンスの問題が発生する可能性があります。

複数のサブスクライバーに同じ値を取得する場合は、Subjectが必要になる場合があります。このため、サブスクリプションが設定されていることを確認してくださいbeforeデータソースにサブスクライブされているサブジェクト。そうしないと、プロセスがスタックします。

詳細はこちら: https://javascript.tutorialhorizo​​n.com/2017/03/23/rxjs-subject-vs-observable/

4

Observableは1人のオブザーバーにしか通知できませんが、Subjectは複数のオブザーバーに通知できます。

3
Mehul Jain

観測可能

  1. 彼らは冷たく、少なくとも1人のオブザーバーがいるときにコードが実行されます。

  2. データのコピーを作成:Observableは各オブザーバーのデータのコピーを作成します。

  3. 単方向:オブザーバーは値をobservable(Origin/master)に割り当てることができません。

  4. コードは各オブザーバーに対して実行されます。 HTTP呼び出しの場合、オブザーバーごとに呼び出されます。

  5. すべてのコンポーネント間で共有したいサービスの場合、最新の結果は得られません。すべての新しいサブスクライバーは同じオブザーバブルにサブスクライブし、ゼロから値を取得します

  6. ユニキャストは、他のコンポーネントからではなく、オブザーバブルから値を放出できることを意味します。

被験者

  1. それらはホットです:オブザーバーがいない場合でも、コードが実行され、値がブロードキャストされます。

  2. データの共有:同じデータがすべてのオブザーバー間で共有されます。

  3. 双方向:オブザーバーはobservable(Origin/master)に値を割り当てることができます。

  4. サブジェクトを使用して使用している場合、オブザーバーを作成する前にブロードキャストされるすべての値が失われます。リプレイサブジェクト

  5. マルチキャスト、複数のサブスクライバーに値をキャストでき、サブスクライバーとエミッターの両方として機能できます

1
jaideep_johny