Observable.prototype.concatAll似乎没有产生预期的结果

时间:2017-01-08 03:52:23

标签: rxjs5 angular2-observables

记住这段代码:

const Rx = require('rxjs');

var i = 3;

const obs = Rx.Observable.interval(10)
    .map(() => i++)
    .map(function(val){
        return Rx.Observable.create(obs => {
            obs.next(val)
        });
    })
    .take(10)
    .concatAll();


obs.subscribe(function(v){
    console.log(v);
});

我原本希望记录的结果如下:

[3,4,5,6,7,8,9,10,11,12]

即10个值,从3开始。

然而,我们得到的只是

3

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

concatMap将在订阅下一个之前等待第一个observable完成。您忘记将.complete()添加到内部observable中,有效地让您的流只发出第一个值3并无限期地等待第一个流完成,然后再查看下一个流。

请注意;根据您的问题,您还可以使用Rx.Observable.of()代替Rx.Observable.create()

进行简单的价值排放

var i = 3;

const obs = Rx.Observable.interval(10)
  .map(() => i++)
  .map(val => Rx.Observable.of(val))
  .take(10)
  .concatAll();

obs.subscribe(v => console.log(v));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>