如果我使用范围并使用takeWhile限制输出:
Rx.Observable
.range( 1, 10 )
.do( idx => console.log('range: ', idx ))
.takeWhile( idx => idx <= 5 )
.subscribe( idx => console.log( 'res : ', idx ))
;
输出是:
range: 1
res : 1
range: 2
res : 2
range: 3
res : 3
range: 4
res : 4
range: 5
res : 5
range: 6
按范围生成的值不会全部消耗掉。 6被拉,没有通过takeWhile,没有更多的值。
现在如果我之间有一个concatMap:
Rx.Observable
.range( 1, 10 )
.do( idx => console.log('range: ', idx ))
.concatMap( idx => {
var res = new Rx.Subject<number>();
setTimeout( () => {
res.next( idx );
res.complete();
}, 10 );
return res;
})
.takeWhile( idx => idx <= 5 )
.subscribe( idx => console.log( 'res: ', idx ))
;
输出是这样的:
range: 1
range: 2
range: 3
range: 4
range: 5
range: 6
range: 7
range: 8
range: 9
range: 10
res: 1
res: 2
res: 3
res: 4
res: 5
我希望,范围生产的价值也会受到限制。 concatMap保留了顺序,因此只有在前一个observable完成时才能提取下一个值。但是所有范围错误都被拉了 这是一个错误吗?或者真正的行为是什么。能帮助你理解吗。
答案 0 :(得分:2)
range()
生成的值在concatMap()
operator内缓存,然后逐个拉出。然后,您使用setTimeout()
异步发出值。操作人员通常不会尝试使用任何背压,因此来源的所有物品在准备好后都会被释放。
请注意,即使使用Observable.of()
和异步调度程序Scheduler.async
,您也可以实现相同的目标。这使得Observable.of
的发射在一个新的事件中发生,使其异步。
const Observable = Rx.Observable;
const Scheduler = Rx.Scheduler;
Rx.Observable
.range( 1, 10 )
.do( idx => console.log('range: ', idx ))
.concatMap( idx => Observable.of(idx, Scheduler.async))
.takeWhile( idx => idx <= 5 )
.subscribe( idx => console.log( 'res: ', idx ));