ReactiveX: Hot, Coldの違い

ReactiveXにおける, Cold/Hot Observableの違いを説明します.

(本文中の「subscribeする」と, 「Observerを登録する」は同義です.)

Cold Observable

Cold ObservableはSubscribeされると動作を開始します.

var source = Rx.Observable.range(1, 10);

// 何か処理
// ...

source.subscribe(function(x) {
  console.log(x); // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
});

例えば, 上のコードだと, sourceを定義した時点ではストリームが生成されておらず, source.subscribeされた時に, 初めてストリームが生成されます. 遅延評価(lazy evaluation)のような振る舞いをします.

次に, 1つのCold Observableに対して複数subscribeしたとします.

var source = Rx.Observable.range(1, 10);

// 何か処理
// ...

source.subscribe(function(x) {
  console.log(x); // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
});
source.subscribe(function(x) {
  console.log(x); // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
});

2つのsubscribeに対して, 別々のストリームが生成されます. 各subscribeは, 完全に独立して動作します.

Cold Observableをまとめると,

Hot Observable

次にHot Observableです. Hot Observableはsubscribeしないでもストリームが生成されます.

var source = Rx.Observable.interval(1000);
var hot = source.publish();

// この時点ではストリームは生成されていない
hot.subscribe(function() {
  console.log('part1');
});

// ストリームが生成される
hot.connect();

hot.subscribe(function() {
  console.log('part2');
});

RxJSでは, publishメソッドをコールするとHotなObservableを作成することが出来ます. それに対して, connectするとストリームが流れ始めます. subscribeとは無関係にストリームが生成されるのがポイントです. Observerが登録されていない時は, データは消滅します. また, HotなObservableは, 1つのストリームに対して複数subscribeすることが出来ます. Coldの場合は, ストリームとsubscribeは, 1対1だったのが, Hotの場合は1対多になります.

Hot Observableをまとめると,

まとめ

Hot, ColdなObservableについて説明しました. 1つのストリーム(同じデータ)に対して複数のことをしたいときはHot, そうでない時はColdを使えば良いと思います. 基本的にはColdを扱うことが多いとは思います.