RXJS concatMap是否也应该延迟拉?

RXJS concatMap是否也应该延迟拉?,rxjs,rxjs5,Rxjs,Rxjs5,如果我使用范围并使用takeWhile限制输出: Rx.Observable .range( 1, 10 ) .do( idx => console.log('range: ', idx )) .takeWhile( idx => idx <= 5 ) .subscribe( idx => console.log( 'res : ', idx )) ; 按范围生成的值并非全部消耗。6被拉取,不通过takeWhile,不获取更多

如果我使用范围并使用takeWhile限制输出:

Rx.Observable
    .range( 1, 10 )
    .do( idx => console.log('range: ', idx ))
    .takeWhile( idx => idx <= 5 )
    .subscribe( idx => console.log( 'res   : ', idx ))
    ;
按范围生成的值并非全部消耗。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 ))
    ;
我预计,在这里,范围生产的价值也会受到限制。concatMap保留顺序,因此只有在前一个可观察对象完成时,才有意义提取下一个值。但是所有的范围错误都会被拉出来。

这是虫子吗?或者什么是真正的行为。请您帮助理解。

range()
生成的值在内部缓冲,然后逐个提取。然后使用
setTimeout()
异步发出值。操作人员通常不会试图利用任何背压,因此当他们准备好时,源中的所有项目都会被排放

请注意,即使使用
Observable.of()
和异步调度程序
scheduler.async
也可以实现同样的效果。这使得的发射在一个新事件中发生,从而使其异步

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 ));
const Observable=Rx.Observable;
const Scheduler=Rx.Scheduler;
可观测
.范围(1,10)
.do(idx=>console.log('range:',idx))
.concatMap(idx=>Observable.of(idx,Scheduler.async))
.takeWhile(idx=>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
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 ));