2016-06-04 2 views
0

어제 rxjs을 사용하기 시작했습니다. 다음 동작을 얻고 싶습니다.시간 및 맞춤 이벤트로 버퍼링

시간 및 사용자 지정 이벤트를 사용하여 버퍼를 생성합니다. 2000 년마다 버퍼가 생성되고 (예 : bufferWithTime 함수 동작), 특별한 이벤트의 경우 버퍼가 생성되고 타이머가 다시 초기화된다고 상상해보십시오. [1, 2], B : [3, 4, 5], C : [6, 7], D : [8, 9] 버퍼 A

콘텐츠 : 여기

기본적인 표현이다.

시간 세그먼트 A, B, D은 동일한 지속 시간, 2000ms를 갖는다.

시간 세그먼트 C은 특수 이벤트 7이 트리거되고 버퍼가 생성 되었기 때문에 더 짧았습니다.

어떻게하면됩니까?

+0

의도 한 동작에 대한 대리석 다이어그램을 지정할 수 있습니까? 여기에 대리석 다이어그램의 예; http://rxmarbles.com/. 기본적으로 타임 라인에 투입물과 예상 결과물을 제시합니다. – user3743222

+0

@ user3743222이 다이어그램으로 더 이해할 수 있기를 바랍니다. – jney

답변

1

시도해 볼 수 있습니까 (jsfiddle)?

// Helper functions 
function randomDelay(bottom, top) { 
    return Math.floor(Math.random() * (1 + top - bottom)) + bottom; 
} 

// Simulation of random sequence 
var source$ = Rx.Observable 
    .range(1, 30) 
    .concatMap(function (x) { 
    return Rx.Observable.of(x).delay(randomDelay(10,500)); 
    }); 

var intervalBetween = 1000; // should be 2000ms in your case 
var dummyStart$ = Rx.Observable.return({}); 
var specialEvent$ = Rx.Observable.fromEvent(document, 'click'); 
var opening$ = dummyStart$.concat(specialEvent$).flatMapLatest(function(x){return Rx.Observable.timer(0, intervalBetween)}); 
var buffers$ = source$.buffer(opening$).skip(1); 

source$.subscribe(function(x){console.log('source', x)}) 

buffers$.subscribe(function(buffer){ 
    console.log('buffer', buffer); 
}); 

생각이 여기 서명 Rx.Observable.prototype.window(windowBoundaries);buffer 연산자를 사용하는 것입니다. 그러면 windowBoundaries 신호와 동기화 된 비 중첩 버퍼가 제공됩니다.

거짓 타이머 을 즉시 시작하는 작은 트릭 (dummyStart)이 있습니다. 이 경우 첫 번째 값으로 빈 버퍼가 생성되고 이는 skip(1)에 의해 제거됩니다.

+0

감사합니다! 나는 당신이 필요로하는 것과 일치하도록 약간의 코드를 변경했다 : http://jsfiddle.net/y7d95cz3/1/ 나에게 당신의 의견을 줄 수 있습니까? 나는 특별한 코드를 너무 구독하고 싶었다. do something of dummyStart – jney

+0

당신은'dummyStart'가 필요합니다. 그렇지 않으면 한 번 클릭 할 때까지 (특별 이벤트) 버퍼가 방출되지 않습니다. 당신이 전송 한 바이올린에서 마우스를 움직이면 결코 클릭하지 않으면 버퍼가 방출되지 않는다는 것을 알 수 있습니다. – user3743222