RxJS SubjectテーマEventEmitterオブジェクトマルチキャストMulticast


Subjectテーマ
Subjectとは?Subjectは、複数の観察者に許容値がマルチキャストされる特殊なObservableである.しかしながら、純粋な観察対象は、ユニキャストである(各購読観察者は、個々の観察可能なオブジェクトの実行を有する).
Subjectは観察対象の一つです.ただ、多くの観測者に放送されます.また、SubjectはEventEmitterにも似ています.保護者が多くのイベントモニターを持っているレジストリです.
各Subjectは、一つのオブザーバーであり、一つのSubjectを与えた後、購読できます.提供された観察者は正常に受信値を開始します.観察者から見ると、観察対象の実行時はユニキャストからのObservableかそれともSubjectからのものかは判断できない.

Subjectの内部では、subscribeは新しい送信を起動して実行する価値がありません.それは観察者レジストリに所与の観察者を登録するだけで、他のライブラリや言語の中のアドレステンダーの働き方に似ています.
各SubjectはObserver観察者の対象です.next()/error()/complettee()メソッドを持つオブジェクトです.Subjectが新しい値を提供するには、next()を呼び出すだけで、Subjectを監督するための観察者にマルチキャストされます.
以上のように、SubjectはObservableの観察対象であり、Observerの観察対象でもあることを知っています.これを覚えることは極めて重要です.
SubjectはNode.jsのEventEmitterオブジェクトと類似しています.イベント送信機です.例えば、popイベントがあり、3つのobserverが購読しています.この3つの購読者はいずれもEventEmitterオブジェクトから同じ情報を受信します.普通のObservableでは、独立しています.Subjectは特別なObservableであり、SubjectはObservableのサブクラスです.
一例
その前に私たちがしなければならない最初のことはRxJSの枠組みを導入することです.
私はtsの開発環境を使っていますので、es 6で導入できます.Node.jsなら、CommonJS仕様を参照して導入してください.
import * as Rx from 'rxjs/Rx'
これから本題に入ります
//    Subject  
let subject = new Rx.Subject();
//  subject
subject.subscribe(data => console.log(`listener1 : get a data ,the data is ${data}`));
subject.subscribe(data => console.log(`listener2 : get a data ,the data is ${data}`));

//    
subject.next(1);
subject.next(2);
out put
listener1 : get a data ,the data is 1
listener2 : get a data ,the data is 1
listener1 : get a data ,the data is 2
listener2 : get a data ,the data is 2
上でsubjectはObservableであり、Observerでもありますので、subjectを一つのobserverとしてobservableに伝えるsubscribe方法もあります.
//    observable
let observable$ = Rx.Observable.from([1,2,3,4,5]);
//  subject
let subject = new Rx.Subject();
//    observer
subject.subscribe(x => console.log(`listener1 : get a data ,the data is ${data}`));
subject.subscribe(x => console.log(`listener2 : get a data ,the data is ${data}`));
observable$.subscribe(subject);
out put:
listener1 : get a data ,the data is 1
listener2 : get a data ,the data is 1
listener1 : get a data ,the data is 2
listener2 : get a data ,the data is 2
listener1 : get a data ,the data is 3
listener2 : get a data ,the data is 3
listener1 : get a data ,the data is 4
listener2 : get a data ,the data is 4
listener1 : get a data ,the data is 5
listener2 : get a data ,the data is 5
Observableを一つのmulticastに変換する(マルチキャスト)
Multicastは実はconnect方法を持つ特殊なObservableです.具体的な実現を見てみます.
let observable$ = Rx.Observable.from([1,2,3]);
//     Multicast
let multicast$ = observable$.multicast(new Rx.Subject());

//     
let subscription1 = multicast$.subscribe(data => {
  console.log(data)
});

let subscription2 = multicast$.subscribe(data => {
  console.log(data)
});
//    
multicast$.connect();
out put:
1
1
2
2
3
3
ここで取り上げる価値があるのはRxJSの中のoperator(オペレータ)は基本的に純関数の形で現れています.それらはいかなる状態を変えないで、元の命令式プログラミングと違って、multicastオペレータは純粋な関数です.Observableに戻ります.実はObservableのサブクラスです.
締め括りをつける
このほかにもたくさんの種類のSubjectがあります.ここでは詳しく説明しません.