RxJS toma primero, luego acelera y espera

Quiero mousewheel evento mousewheel utilizando RxJS-DOM para que cuando el primer evento se active, lo envíe y luego deje caer cualquier valor hasta que el retraso entre los valores posteriores pase una duración especificada previamente.

El operador que estoy imaginando podría ser algo así como:

 Rx.DOM.fromEvent(window, 'mousewheel', (e) => e.deltaY) .timegate(500 /* ms */) 

Imagine la siguiente secuencia de datos:

 0 - (200 ms) - 1 - (400ms) - 2 - (600ms) - 3 

donde el valor que se envía es el número y el time describe cuánto tarda el siguiente valor en llegar. Como 0 es el primer valor, se emitiría y luego se descartarían todos los valores hasta 3 porque las demoras individuales entre los valores posteriores no son mayores de 500ms .

A diferencia del acelerador, el time de retardo entre los valores se calcula independientemente de que se haya emitido o no el último valor recibido. Con el acelerador, 0 serían enviados, pasarían 200 ms, 1 sería evaluado y fallaría, pasarían 400 ms y 2 serían evaluados y PASS porque el time transcurriría entre el último valor emitido (0) y el recibido actualmente (2 ) es de 600 ms, mientras que con mi operador, se evaluaría en relación con el 1 y el time transcurrido sería de 400 ms, por lo que no pasaría la testing.

Y este operador tampoco es antirrebote. En lugar de esperar hasta que haya transcurrido el intervalo para emitir, primero envía el primer valor y luego evalúa todos los valores futuros, y así sucesivamente.

¿Un operador como este ya existe? Y si no, ¿cómo podría hacer una?

Puede lograr esto con relativa facilidad utilizando el operador timeInterval que calcula con precisión el intervalo de time entre valores sucesivos. Aquí hay un código de muestra que puedes adaptar a tu apariencia.

http://jsfiddle.net/a7uusL6t/

 var Xms = 500; var click$ = Rx.Observable.fromEvent(document, 'click').timeInterval() var firstClick$ = click$.first().map(function(x){return x.value}); var res$ = firstClick$ .concat(click$ .filter(function (x) { console.log('interval', x.interval); return x.interval > Xms;}) .map(function(x){return x.value}) ); res$.subscribe(function(x){console.log(x)}) 

Resolví mi problema con algo similar pero más refinado que la respuesta de @ user3743222:

 const events = Rx.Observable.fromEvent(window, 'mousewheel', (e) => e.deltaY); const firstEventObservable = events.take(1); const remainingEventsObservable = events.skip(1) .timeInterval() .filter(x => x.interval >= this.props.delayDuration) .map(x => x.value); const pageChangeObservable = firstEventObservable.concat(remainingEventsObservable); 
    Intereting Posts