2016-08-14 4 views
0

컨텍스트 : 많은 ConnectableObservable이 있는데 거의 모든 재생 횟수는 1 이상입니다. 주어진 시간에 구독하고 구독을 취소하는 관찰자가 많이 있습니다.RxJS : 가입 순간 이후에만 방출되는 Observable 데이터를 어떻게 구독합니까?

내가 원하는 것 : 많은 경우 관찰자가이 관찰 대상 중 하나에 구독하면 관찰 대상의 데이터 재생 메커니즘으로 인해 수신 할 수있는 기존의 방출 된 데이터는 신경 쓰지 않습니다. 최근에 구독 한 관찰자가 관심을 갖는 유일한 데이터는 가입 순간 이후에 방출되는 데이터입니다.

const observable = Rx.Observable 
    .interval(100) 
    .take(4) 
    .publishReplay(3); 

observable.connect(); 

문제 : 관찰자의 관찰에 가입 할 때 지금까지 내가 말할 수있는, 그것은 전에 또는 가입의 순간 후 방출 된 관찰합니다 데이터 여부를 알 수있는 방법이 있습니다.

observable.subscribe(x => console.log('observed', x)); 

setTimeout(() => 
    observable.subscribe(y => console.log('delayed observed', y)), 
    400 
); 

가 출력 위 코드 :

// => observed 0 
// => observed 1 
// => observed 2 
// => delayed observed 0 **don't care** 
// => delayed observed 1 **don't care** 
// => delayed observed 2 **don't care** 
// => observed 3 
// => delayed observed 3 

이 가상의 상황에서, 지연은 관찰자 구독 잠시 후 출사 데이터에만 관심이다; 이 경우 3입니다.

나는 RxJS 5 reference docs을 샅샅이 뒤졌고, 내가 무엇을했는지 달성하기 위해 은색 총알 연산자를 찾지 못하는 것 같습니다. 어떤 아이디어?

+0

이 함께 해결하기 위해 노력하고있는 실제 문제가 무엇입니까? 덜 추상적 인 예를 제공 할 수 있습니까? – jonrsharpe

+0

누가 재생해야합니까? 지연된 관측자는 재생되지 않는 스트림의 버전을 구독 할 수 없습니까? – Ptival

+0

원하는 것은 HOT Observables입니다. 이 문서를 확인하십시오. https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables –

답변

1

재생되는 요소가 동 기적으로 재생되기 때문에 .skipUntil(Rx.Observable.timer(0))을 사용할 수 있으며 skipUntil은 재생 값을받을 때 정확히 Observable의 나머지 부분을 동기화 실행에서 제외합니다.

이 코드는 원하는 결과를 얻을 것이다 :

const observable = Rx.Observable 
 
    .interval(100) 
 
    .take(4) 
 
    .publishReplay(3); 
 

 
observable.subscribe(x => console.log('observed', x)); 
 

 
setTimeout(() => 
 
    observable 
 
     .skipUntil(Rx.Observable.timer(0)) 
 
     .subscribe(y => console.log('delayed observed', y)), 
 
    400 
 
); 
 

 
observable.connect();
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.3/Rx.min.js"></script>

0

다음과 같이 할 수 있습니까?

const observableNoReplay = Rx.Observable 
    .interval(100) 
    .take(4); 

const observable = observableNoReplay 
    .publishReplay(3); 

observable.connect(); 

시간대에 필요한 관찰 가능 목록에 가입 할 수 있으며 모든 종류의 은색 탄환에 대해 걱정할 필요가 없습니다.

관련 문제