2017-01-08 1 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] 

을, 그러나 3

로 시작하는 10 개 값은, 우리가 얻을 모두는

3 
입니다

누구나 그 이유를 알고 있습니까?

답변

2

concatMap은 첫 번째 관측 가능 항목이 다음에 가입하기 전에 완료 될 때까지 대기합니다. 을 내부 observable에 추가하는 것을 잊어 버렸습니다. 효과적으로 스트림의 첫 번째 값 3 만 내보내고 첫 번째 스트림이 끝날 때까지 무기한 대기하면서 옆에 concatting합니다.

참고; 귀하의 질문에 따라 간단한 값 방출을 위해 당신은 또한 대신

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

Rx.Observable.create()가 대단히 감사의 Rx.Observable.of()을 사용할 수 있습니다 - 나는 테이크 (10)의 필요성을 제거하는 것이 100 %를 생각했을 것입니다 당신이 말하는 완전한() 호출이 필요합니다. complete()를 호출해야한다는 것은 말이되지 않습니다. take (10)가 처리 했어야합니다. 죄송하지만 RxJS는이 경우 IMO에서 올바른 일을하지 않습니다. –

+0

아주 간단한 예제로 표기 : –

+0

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

관련 문제