2015-02-02 1 views
4

나는 추위와 뜨거운 Observable의 차이를 이해한다고 생각했지만, 분명히 뭔가가 나를 벗어납니다. 이와예기치 못한 추위 Observable behavior

var obs = Rx.Observable.interval(2000); 

var A = obs.subscribe(function(value) { console.log('A', value) }); 
var B = obs.subscribe(function(value) { console.log('B', value) }); 

, 나는 다음과 같은 결과를 얻을 :이 코드는 예상대로 작동

var obs = Rx.Observable.interval(2000).flatMap(function() { 
    return Rx.DOM.jsonpRequest({ url: URL }); 
}) 
.map(function(value) { return value.prop; }); 

var A = obs.subscribe(function(value) { console.log('A', value) }); 
var B = obs.subscribe(function(value) { console.log('B', value) }); 

I :

A 0 
B 0 
A 1 
B 1 
... 

을하지만 원격 JSONP 리소스를 검색 할 flatMap를 추가 할 때 A 로그 만 수신 :

A prop 
A prop 
A prop 
... 

Observable을 publish().refCount()을 사용하여 뜨거운 것으로 바꾸면 예상대로 작동합니다. 두 구독자가 동일한 값을 수신한다는 것입니다.

Observer가 감기에 걸리므로 같은 값을 동시에 수신하지 않아도되지만 AB 명의 관찰자가 모두 A뿐만 아니라 값을 수신 할 것으로 예상됩니다.

무엇이 여기에 있습니까?

+1

실제로 작동해야합니다. 'jsonpRequest' 줄 앞에'console.log' 문을 넣으십시오. 또한 onError와 onComplete 핸들러를 더 많은 로그 문으로'subscribe' 호출에 추가하십시오. 아마도'B' 구독이 중복 된 jsonp 요청을 발행하려고 할 때 이상한 이유로 실패했을 것입니다. – Brandon

+0

아무런 오류가 없습니다. 그렇지만'jsonpRequest' 라인 앞의'console.log'는 두 번 호출됩니다. 또한'setTimeout' 안에'B'를 넣으면 예상대로 작동합니다./cc @Brandon – GiantSquid

답변

1

RxJs-DOM의 버그처럼 보입니다. 문제를 열어야합니다. 내가 대신 객체 리터럴 문자열로 URL을 전달하여 버그를 해결 수 있다고 생각 :

return Rx.DOM.jsonpRequest(URL);

편집 : 다시 읽는 소스를, 내가하지 해결 방법이 효과가 있다고 생각하십시오. 버그를 해결하려면 defer을 사용해야한다고 생각합니다.

return Rx.Observable.defer(function() { return Rx.DOM.jsonpRequest({ url: URL }); });