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