2015-06-15 26 views
15

Czy ktoś może wyjaśnić w prosty sposób, co robi RxJS Observavle debounce function?Do czego służy debian RxJS.Observable?

Wyobrażam sobie, że emituje zdarzenie raz na jakiś czas w zależności od parametrów, ale mój kod poniżej nie działa tak, jak się spodziewałem.

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); 
}); 

i the JsBin version.

Spodziewałem się, że ten kod wydrukuje jedno kliknięcie raz na sekundę, bez względu na to, jak szybko klikam. Zamiast tego wypisuje kliknięcie, które według mnie są losowymi interwałami.

+0

FYI może ci pomóc strona [rxmarbles] (http://rxmarbles.com/#debounce). Jest to praca w toku i nie ma wszystkich operatorów, ale ma "odbicie" :) – Brandon

+0

@Brandon jest link w mojej odpowiedzi :-) – zerkms

Odpowiedz

17

Zanurzenie wyemituje wartość po upływie określonego czasu, bez emisji innej wartości.

za pomocą prostych wykresów następujące może zapewnić większą pomocy:

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

    after debounce, the emitted stream looks like as follows: 

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

Pozycje pośrednie (w tym przypadku, 2,3,4) jest ignorowana.

Przykładem jest przedstawiony poniżej:

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

użyłem węzeł to zilustrować ... zakładając, że masz zainstalowany węzeł, można uruchomić go wpisując

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

Gdy program ten węzeł jest Zaczęło się pisać wartości na konsoli - jeśli wpisujesz szybko, elementy są ignorowane, a jeśli wpisz przerywany szybko i powolny element pojawi się po przerwie w pisaniu (w powyższym przykładzie mam 500 ms) na konsoli ("Dalej:")

Istnieją również doskonały materiał odniesienia w https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md

+0

Ta odpowiedź pomogła zrozumieć 'debounce', podczas gdy poprzednia oferowała rozwiązanie mojego problemu. – Adrian

+0

@Adrian ta odpowiedź odtwarza ** dokładnie taki sam ** diagram, do którego podałem link. – zerkms

+0

Rzeczywiście. Zanim zadałem pytanie, bardzo się spoglądałem na rxmarbles. Dlatego poprosiłem o zwykły angielski. – Adrian

5

.debounce() wyświetla ostatnią otrzymaną wartość, jeśli żadna wartość nie została odebrana w określonym przedziale.

Oznacza to, że jak tylko klikniesz w ciągu sekundy - nic nie zostanie wyprodukowane.

Jeśli chcesz, aby wartości przepustnicy były emitowane nie częściej niż co sekundę, musisz użyć wartości .sample(1000).

+1

[throttileFirst] (https://github.com /Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/throttlefirst.md) to kolejny dobry wybór: po pierwszym kliknięciu emituje natychmiast zdarzenie kliknięcia, ale ignoruje wszystkie kliknięcia w ciągu następnych X milisekund . – Brandon

+0

@brandon o tak wielu dostępnych operatorów. Dzięki – zerkms

6

długie opowiadanie: ZWLOKA czeka na czasie X, że strumień nie emituje żadnych nowych wartości, pozwól ostatnią przepustkę wartości.

Długa historia: Gdy wartość nie jest emitowany, nieczułości wstrzyma swoją emisję o czasie X, aby zobaczyć czy kolejna wartość jest emitowana w rzeczywistości blokuje strumień w tym czasie. Jeśli podczas czasu ponownego odbicia zostanie wyemitowana nowa wartość, licznik zostanie ponownie uruchomiony, a odbój będzie czekał przez cały czas. Jeśli licznik czasu wygaśnie bez emisji nowej wartości, to przepuszcza ostatnią wartość.

Załóżmy, że chcesz dodać autouzupełnianie do pola wprowadzania. Jeśli użytkownik wstawi "a", możesz chcieć pokazać mu opcje "żołądź, alaska", ale jeśli użytkownik zaraz po naciśnięciu "l" zaproponowałbyś "alaskę". W takim przypadku lepiej poczekać, aż użytkownik przestanie naciskać klawisze, aby uniknąć niepotrzebnej pracy.potwierdź, że jest to odpowiednie narzędzie: czeka na X czas, w którym strumień nie emituje żadnej nowej wartości.