Что делает RxJS.Observable debounce?

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

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

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 ответа

Решение

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 myfile.js  (where the aforementioned code is in myfile.js)

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

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

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

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

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

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

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

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

Другие вопросы по тегам