Observable.prototype.concatAll 似乎没有产生预期的结果
Observable.prototype.concatAll does not seem to yield expected result
牢记这段代码:
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
有人知道为什么会这样吗?
concatMap
将等待第一个 observable 完成,然后再订阅下一个。您忘记将 .complete()
添加到您的内部可观察对象中,有效地让您的流仅发出第一个值 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>
牢记这段代码:
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
有人知道为什么会这样吗?
concatMap
将等待第一个 observable 完成,然后再订阅下一个。您忘记将 .complete()
添加到您的内部可观察对象中,有效地让您的流仅发出第一个值 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>