2017-01-08 18 views
2

С помощью этого кода в виду:Observable.prototype.concatAll, кажется, не дают ожидаемого результата

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 

Кто-нибудь знает, почему это было бы?

ответ

2

concatMap будет ждать завершения первого наблюдения до подписки на следующий. Вы забыли добавить .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>

+0

большое спасибо - я бы подумал 100%, что взять (10) устранило бы необходимость для полного вызова(), который вы говорите, необходимо. Не имеет смысла, что вам нужно вызвать complete(). (10) должны позаботиться об этом. Извините, но RxJS не делает правильные вещи в этом случае IMO. –

+0

В качестве очень простого примера. Марк: –

+0

const obs = Rx.Observable.interval (10) .toArray(); –