2015-06-15 7 views
15

Kann jemand in Plain Englisch erklären, was RxJS Observavle debounce function tut?Was bewirkt RxJS.Observable Entprellen?

Ich stelle mir vor, dass es abhängig von den Parametern hin und wieder ein Ereignis ausgibt, aber mein Code unten funktioniert nicht wie erwartet.

var x$ = Rx.Observable.fromEvent(window, 'click') 
.map(function(e) {return {x:e.x, y:e.y};}) 
.debounce(1000) 
.subscribe(function(el) { 
    console.log(el); 
}); 

und the JsBin version.

Ich erwartete, dass dieser Code einen Klick pro Sekunde drucken würde, egal wie schnell ich klicke. Stattdessen druckt es den Klick auf zufällige Intervalle.

+0

FYI die [rxmarbles Website] (http://rxmarbles.com/#debounce) kann helfen. Es ist ein work in progress und hat nicht alle Operatoren, aber es hat "entprellen" :) – Brandon

+0

@Brandon gibt es einen Link in meiner Antwort :-) – zerkms

Antwort

17

Debounce gibt einen Wert aus, nachdem ein angegebenes Zeitintervall abgelaufen ist, ohne dass ein anderer Wert ausgegeben wird.

einfache Diagramme, die die folgende Verwendung von mehr Hilfe bieten kann:

Stream 1 | ---1-------2-3-4-5---------6---- 

    after debounce, the emitted stream looks like as follows: 

Stream 2 | ------1-------------5---------6- 

Die Zwischenpositionen (in diesem Fall 2,3,4) ignoriert werden.

Ein Beispiel unten veranschaulicht:

var Rx = require('rx-node'); 
var source = Rx.fromStream(process.stdin).debounce(500); 
var subscription = source.subscribe(
    function (x) { 
     console.log('Next: %s', x); 
    } 
); 

I Knoten dieses ... zu veranschaulichen verwendet vorausgesetzt, Sie Knoten installiert haben, können Sie es laufen durch

$node myfile.js (where the aforementioned code is in myfile.js) 

Sobald dieser Knoten Programm eingeben ist gestartet können Sie Werte an der Konsole eingeben - wenn Sie schnell eingeben, werden Elemente ignoriert, und wenn der Typ zeitweise schnell und langsam Elemente nach einer Lücke in der Eingabe erscheinen (im obigen Beispiel habe ich 500ms) an der Konsole ("Weiter:")

Es gibt auch einige ausgezeichnete Referenzmaterial bei https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md

+0

Diese Antwort half zu verstehen "Entprellen", während der vorherige die Lösung für mein Problem bot. – Adrian

+0

@Adrian diese Antwort reproduziert ** genau das gleiche ** Diagramm, das ich einen Link zu. – zerkms

+0

In der Tat. Ich habe viel nach Rommeln geschaut, bevor ich die Frage gestellt habe. Deshalb habe ich nach einfachem Englisch gefragt. – Adrian

5

.debounce() erzeugt den letzten empfangenen Wert, wenn innerhalb des angegebenen Intervalls keine Werte empfangen wurden.

Es bedeutet, dass sobald Sie innerhalb einer Sekunde klicken - nichts produziert wird.

Wenn Sie Werte, die nicht häufiger als jede Sekunde ausgegeben werden sollen, drosseln möchten, müssen Sie stattdessen .sample(1000) verwenden.

+1

[throttileFirst] (https://github.com /Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/throttlefirst.md) ist eine weitere gute Wahl: Wenn Sie das erste Mal klicken, wird das click -Ereignis sofort ausgegeben, aber dann werden alle Klicks für die nächsten X Millisekunden ignoriert . – Brandon

+0

@Brandon oh, es gibt so viele verschiedene Operatoren zur Verfügung. Danke – zerkms

6

Lange Rede kurzer: debounce wartet X Zeit, dass der Strom keinen neuen Wert aussendet, dann den letzten Wert verstreichen lassen.

Lange Geschichte: Sobald ein Wert ausgegeben wird, debounce wird seine Emission für X zeit pausieren, um zu sehen, ob ein anderer Wert ausgegeben wird, in der Tat, den Strom während dieser Zeit blockiert. Wenn während der Entprellzeit ein neuer Wert ausgegeben wird, wird der Timer neu gestartet und die Entprellung wartet erneut auf die volle Zeit. Wenn der Zeitgeber abläuft, ohne dass ein neuer Wert ausgegeben wird, wird der letzte Wert übergeben.

Angenommen, Sie möchten Autocomplete einem Eingabefeld hinzufügen. Wenn der Benutzer "a" einfügt, möchten Sie ihm vielleicht die Auswahl "Eichel, Alaska" zeigen, aber wenn der Benutzer gleich nach dem Drücken von "l" schlägt, würden Sie nur "alaska" vorschlagen. In diesem Fall ist es besser zu warten, bis der Benutzer aufhört, auf die Tastatur zu drücken, um unnötige Arbeit zu vermeiden.entprellen es ist das richtige Werkzeug hier: Es wartet auf X Zeit der Strom keinen neuen Wert ausgibt