Что делает 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)
вместо.