Что делает 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 ответа:
Debounce выдаст значение после того, как указанный интервал времени пройдет без другого значения.
С помощью простых диаграмм большую помощь может оказать следующее:
Промежуточные пункты (в данном случае 2,3,4) игнорируются.Stream 1 | ---1-------2-3-4-5---------6---- after debounce, the emitted stream looks like as follows: Stream 2 | ------1-------------5---------6-
Пример иллюстрируется ниже:
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)
вместо этого.