Что делает RxJS.Наблюдаемые дребезга делать?


Может ли кто-нибудь объяснить на простом английском языке, что делает функция RxJS Observavle debounce?

Я предполагаю, что он выдает событие время от времени в зависимости от параметров, но мой код ниже не работает, как я ожидал.

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

И версия JsBin.

Я ожидал, что этот код будет печатать один щелчок один раз в секунду, независимо от того, как быстро я нажимаю. Вместо этого он печатает щелчок, как мне кажется, через случайные интервалы.

3 17

3 ответа:

Debounce выдаст значение после того, как указанный интервал времени пройдет без другого значения.

С помощью простых диаграмм большую помощь может оказать следующее:

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

    after debounce, the emitted stream looks like as follows:

Stream 2 | ------1-------------5---------6-
Промежуточные пункты (в данном случае 2,3,4) игнорируются.

Пример иллюстрируется ниже:

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

Я использовал node, чтобы проиллюстрировать это... предполагая, что у вас установлен узел, вы можете запустить его, набрав

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

После запуска этой узловой программы вы можете ввести значения в console -- если вы набираете быстро, элементы игнорируются, а если набираете прерывисто, то быстрые и медленные элементы появятся после перерыва в наборе (в примере выше у меня есть 500 мс) на консоли ("Next:")

Есть также некоторые отличные справочные материалы на https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md

Короче говоря, долгая история : debounce ждет X раз, когда поток не испускает никакого нового значения,а затем пропускает последнее значение.

Длинная история : После того, как значение испущено, debounce приостановит его испускание на время X, чтобы увидеть, испускается ли другое значение, фактически блокируя поток в течение этого времени. Если новое значение испускается в течение времени debounce, то таймер перезапускается и debounce снова ожидает полного времени. Если его таймер истекает без какого-либо нового значения испущенный, он позволил последнему значению пройти.

Предположим, что вы хотите добавить автозаполнение в поле ввода. Если пользователь вставит "а", вы можете показать ему варианты" желудь, Аляска", но если пользователь сразу после нажатия" л "предложит просто"Аляска". В этом случае лучше подождать, пока пользователь перестанет нажимать на клавиатуру, чтобы избежать ненужной работы. debounce-это правильный инструмент здесь: он ждет X раз, когда поток не испускает никакого нового значения

.debounce() возвращает последнее полученное значение, если в течение указанного интервала не было получено ни одного значения.

Это означает, что как только вы нажмете В течение секунды - ничего не будет произведено.

Если вы хотите, чтобы значения дроссельной заслонки излучались не чаще, чем каждую секунду, которую вам нужно использовать .sample(1000) вместо этого.