Что делает RxJS.Observable debounce?
Может ли кто-нибудь объяснить на простом английском языке, что функция отклонений Observavle RxJS делает?
Я предполагаю, что это время от времени генерирует событие в зависимости от параметров, но мой код ниже не работает, как я ожидал.
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.
Я ожидал, что этот код будет печатать один клик один раз в секунду, независимо от того, как быстро я нажимаю. Вместо этого он печатает клик по тому, что я считаю случайными интервалами.
Ответы
Ответ 1
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, вы можете запустить его, набрав
$node myfile.js (where the aforementioned code is in myfile.js)
Как только эта программа node запущена, вы можете вводить значения в консоли - если вы вводите быстрые элементы, игнорируются, и если тип чередующихся быстрых и медленных элементов появится после пробела при наборе текста (в приведенном выше примере я 500 мс) на консоли ( "Далее:" )
Существует также отличный справочный материал на https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md
Ответ 2
Короче говоря:
debounce ожидает X времени, что поток не испускает никакого нового значения, а затем пропускает последнее значение.
Длинная история:
Как только значение испускается, debounce приостанавливает его излучение в течение X-времени, чтобы увидеть, испускается ли другое значение, фактически блокируя поток в течение этого времени. Если во время дебюта выбрано новое значение, таймер перезапускается, и debounce снова ждет в течение полного времени.
Если его таймер истекает без какого-либо нового значения, оно пропускает последнее значение.
Скажем, что вы хотите добавить автозаполнение в поле ввода. Если пользователь вставляет "a", вы можете показать ему выбор "желудь, аляска", но если пользователь сразу после нажатия "l" вы предложите просто "аляску". В этом случае лучше подождать, пока пользователь перестанет нажимать клавиатуру, чтобы избежать ненужной работы. debounce it the right tool here: он ожидает X-времени, что поток не испускает никакого нового значения
Ответ 3
.debounce()
производит последнее полученное значение, если в течение заданного интервала не было получено значений.
Это означает, что как только вы нажмете в течение секунды - ничего не будет создано.
Если вы хотите дросселировать значения, которые будут излучаться не чаще, чем каждую секунду, вам нужно использовать .sample(1000)
.