Дебаунс
только излучает элемент из Observable, если определённый интервал времени прошёл без излучения другого элемента
Оператор Debounce фильтрует элементы, излучаемые исходным Observable, которые быстро следуют за другим излучаемым элементом.
См. также
- Операторы, связанные с backpressure
- Sample
- Window
- Введение в Rx: Throttle
- RxMarbles:
debounce - RxMarbles:
debounceWithSelector - 101 Примеры Rx: Throttle — Simple
Информация, специфичная для языка
RxGroovy debounce throttleWithTimeout
RxGroovy реализует этот оператор как throttleWithTimeout и debounce.
Обратите внимание, что последний элемент, излученный исходным Observable, будет излучен в свою очередь этим оператором, даже если уведомление onCompleted исходного Observable издано в течение заданного интервала времени с момента излучения этого элемента. То есть: уведомление onCompleted не вызовет задержку.
Один из вариантов throtleWithTimeout/debounce (два названия для одного и того же варианта оператора) выполняет задержку через периодические интервалы времени, которые вы выбираете, передавая в оператор TimeUnit и количество таких единиц в качестве параметров.
Этот вариант по умолчанию работает на computation Scheduler, но вы можете в качестве третьего параметра передать Scheduler по своему выбору.
Существует также вариант debounce (у которого нет псевдонима throttleWithTimeout), который выполняет задержку исходного Observable, применяя функцию к каждому излучаемому элементу, эта функция генерирует Observable. Если исходный Observable излучает другой элемент до завершения этого вновь сгенерированного Observable, debounce будет подавлять этот элемент.
Этот вариант debounce по умолчанию не работает на каком-либо конкретном Scheduler.
- Javadoc:
debounce(Func1)
RxJava 1․x debounce throttleWithTimeout
RxJava реализует этот оператор как throttleWithTimeout и debounce.
Обратите внимание, что последний элемент, излученный исходным Observable, будет излучен в свою очередь этим оператором, даже если уведомление onCompleted исходного Observable издано в течение заданного интервала времени с момента излучения этого элемента. То есть: уведомление onCompleted не вызовет задержку.
Один из вариантов throtleWithTimeout/debounce (два названия для одного и того же варианта оператора) выполняет задержку через периодические интервалы времени, которые вы выбираете, передавая в оператор TimeUnit и количество таких единиц в качестве параметров.
Этот вариант по умолчанию работает на computation Scheduler, но вы можете в качестве третьего параметра передать Scheduler по своему выбору.
Существует также вариант debounce (у которого нет псевдонима throttleWithTimeout), который выполняет задержку исходного Observable, применяя функцию к каждому излучаемому элементу, эта функция генерирует Observable. Если исходный Observable излучает другой элемент до завершения этого вновь сгенерированного Observable, debounce будет подавлять этот элемент.
Этот вариант debounce по умолчанию не работает на каком-либо конкретном Scheduler.
- Javadoc:
debounce(Func1)
RxJS debounce debounceWithSelector throttleWithTimeout
Первый вариант — называемый либо debounce или throttleWithTimeout — принимает в качестве параметра продолжительность, определенную как целое число миллисекунд, и подавляет любые излучаемые элементы, за которыми следуют другие излучаемые элементы в течение этого интервала времени с момента излучения первого элемента.
Пример кода
var times = [
{ value: 0, time: 100 },
{ value: 1, time: 600 },
{ value: 2, time: 400 },
{ value: 3, time: 700 },
{ value: 4, time: 200 }
];
// Delay each item by time and project value;
var source = Rx.Observable.from(times)
.flatMap(function (item) {
return Rx.Observable
.of(item.value)
.delay(item.time);
})
.debounce(500 /* ms */);
var subscription = source.subscribe(
function (x) {
console.log('Next: %s', x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
Next: 0 Next: 2 Next: 4 Completed
Оператор debounceWithSelector выполняет задержку исходного Observable, применяя функцию к каждому излучаемому элементу, эта функция генерирует Observable. Если исходный Observable излучает другой элемент до завершения этого вновь сгенерированного Observable, debounce будет подавлять этот элемент.
Пример кода
var array = [
800,
700,
600,
500
];
var source = Rx.Observable.for(
array,
function (x) {
return Rx.Observable.timer(x)
})
.map(function(x, i) { return i; })
.throttleWithSelector(function (x) {
return Rx.Observable.timer(700);
});
var subscription = source.subscribe(
function (x) {
console.log('Next: ' + x);
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
Next: 0 Next: 3 Completed
debounce и debounceWithSelector находятся в каждом из следующих распределений:
rx.all.jsrx.all.compat.js-
rx.time.js(требуетrx.jsилиrx.compat.js) rx.lite.jsrx.lite.compat.js
RxPHP throttle
RxPHP реализует этот оператор как throttle.
Возвращает Observable, который излучает только первый элемент, излученный исходным Observable в течение последовательных временных интервалов заданной продолжительности. Если элементы излучаются на исходном observable до истечения периода времени, последний элемент, излученный на исходном observable, будет излучен.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/throttle/throttle.php
$times = [
['value' => 0, 'time' => 10],
['value' => 1, 'time' => 200],
['value' => 2, 'time' => 400],
['value' => 3, 'time' => 500],
['value' => 4, 'time' => 900]
];
// Delay each item by time and project value;
$source = Observable::fromArray($times)
->flatMap(function ($item) {
return Observable::of($item['value'])
->delay($item['time']);
})
->throttle(300 /* ms */);
$subscription = $source->subscribe($stdoutObserver);
Next value: 0 Next value: 1 Next value: 3 Next value: 4 Complete!
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/debounce.html