whenの力

whenは複数のPlanオブジェクトを受け取り、そのPlan通り、並列にメッセージを送出するObservableを作成するメソッドです

planは複数のObservableから生成することができるので、Observableの合成によって、とても複雑なObservableができます

Planの作り方

Planは複数のObservableをandでつなげてPatternを生成し、thenDoでPlanへと変換します

Patternがメッセージを送出するタイミングを表し、thenDoでそれぞれのタイミングで送出するメッセージを選択することで、Planオブジェクトが出来上がるというわけです

例1

var repeats = Rx.Observable.return("plan1").repeat(10);
var timer = Rx.Observable.interval(1000);
var pattern = repeats.and(timer);

例1では"plan1"という文字列を10回送出するストリームと、1000msごとに送出するストリームをandしてPatternを作っています

andでつなぐと、2つのストリームの値が揃った時に流れ、片方が終了したら終了するというPatternになります。

つまり、repeatストリームは瞬時に10回で終了するストリームで、timerは1秒ごとに無限に流れるストリームのため、andでつなぐと、1秒ごとに10回流れて終了するPatternになります

PatternのPlanへの変換

PatternはthenDoを使ってPlanへと変換します

thenDoはandでつないだ数分の複数の引数を受け取り、一つの値を返す関数を引数として与えます

例2

var repeats = Rx.Observable.return("plan1").repeat(10);
var timer = Rx.Observable.interval(1000);
var pattern = repeats.and(timer);
var plan = pattern.thenDo((x:string,y:number):string => x);

例2はthenDoを使って、1秒ごとに10回plan1が流れて終了するPlanを作成している例です

これをwhenに入れるとObservableが出来上がります