2016-06-04 6 views
0

Ich begann gestern mit rxjs. Ich möchte das folgende Verhalten erreichen:Pufferung mit Zeit und benutzerdefinierten Ereignis

Ich möchte, dass mein Puffer mit Zeit und benutzerdefinierten Ereignissen erstellt wird. Stellen Sie sich vor, alle 2000 ms wird mein Puffer erzeugt (wie Standard bufferWithTime Funktionsverhalten) und für ein spezielles Ereignis wird ein Puffer erzeugt und der Timer wird neu initialisiert. Hier

eine Prinzipdarstellung:

Inhalt des Puffers A: [1, 2], B: [3, 4, 5], C: [6, 7], D: [8, 9].

Zeitsegmente A, B, haben die gleiche Dauer, 2000 ms.

Das Zeitsegment C war kürzer, da das spezielle Ereignis 7 ausgelöst wurde und ein Puffer erzeugt wurde.

Wie kann ich das tun?

+0

Können Sie ein Marmordiagramm des beabsichtigten Verhaltens angeben? Beispiele für Marmordiagramme hier; http://rxmarbles.com/. Dies stellt im Grunde die Eingaben und die erwarteten Ausgaben auf einer Zeitleiste dar. – user3743222

+0

@ user3743222 ich hoffe es ist verständlicher mit diesem Diagramm – jney

Antwort

1

Können Sie das versuchen (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); 
}); 

Die Idee hier ist die buffer Operator mit der Unterschrift Rx.Observable.prototype.window(windowBoundaries); zu verwenden. Das sollte Ihnen nicht überlappende Puffer geben, die synchron mit dem windowBoundaries Signal ausgesendet werden.

Es gibt einen kleinen Trick (dummyStart), um den Timer sofort mit einer falschen specialEvent zu starten. Das erzeugt einen leeren Puffer als ersten Wert, der durch skip(1) entfernt wird.

+0

danke! Ich habe meinen Code so geändert, dass er dem entspricht, was ich brauche: http://jsfiddle.net/y7d95cz3/1/ Kannst du mir deine Meinung sagen? Ich wollte auch speziellen Code abonnieren. Ich verstehe nicht den Punkt von 'DummyStart' – jney

+0

Sie brauchen den' DummyStart' obwohl sonst, bis Sie einmal klicken (spezielles Ereignis) kein Puffer wird ausgegeben werden. In der Geige, die Sie gesendet haben, wenn Sie die Maus bewegen und niemals klicken, werden Sie sehen, dass kein Puffer ausgegeben wird. – user3743222

Verwandte Themen