

以下のコードの出力なんですが、

[code]

    var source = Rx.Observable
    .range(1, 3)
    .flatMap(function (v) {
        return Rx.Observable.range(1, 3);
    })
    .subscribe(function (v) {
        console.log(v)
    });
    
[/code]

下記になります。

[code]

    1
    2
    1
    3
    2
    1
    3
    2
    3
    
[/code]

ところが、私がイメージしていた結果は

[code]

    1
    2
    3
    1
    2
    3
    1
    2
    3
    
[/code]

[公式のドキュメント](https://github.com/Reactive-
Extensions/RxJS/blob/master/doc/api/core/operators/selectmany.md)を見てもさっぱり分からないです。

なぜそうなるのか、何方か説明して頂けませんか？ ありがとうございます！


CC BY-SA 3.0
2015-01-26T04:39:16.390
5304
2015-01-26T09:42:56.400
2015-01-26T04:54:24.373
208
7526
question
javascript rx-javascript
RxJS の `flatMap` の挙動が直感と異なる


この動きはflatMapによるものではなくて、Observable.rangeのスケジューラによるものですね。

Observable.rangeの中をみると、デフォルトでScheduler.currentThreadというスケジューラを利用しています。  
期待の動作を得るためには、以下のようにScheduler.immediateを使って即時実行するとよいかと思います。

[code]

    var source = Rx.Observable
    .range(1, 3, Rx.Scheduler.immediate)
    .flatMap(function (v) {
        return Rx.Observable.range(1, 3, Rx.Scheduler.immediate);
    })
    .subscribe(function (v) {
        console.log(v)
    });
    
[/code]

参考:  
<https://github.com/Reactive-
Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md>


CC BY-SA 3.0
2015-01-26T06:01:10.137
5309
2015-01-26T09:42:56.400
2015-01-26T09:42:56.400
2757
2757
5304
answer