Spec-Zone.ru › ReactiveX

Дебаунс

только излучает элемент из Observable, если определённый интервал времени прошёл без излучения другого элемента
Открыть интерактивную диаграмму на rxmarbles.com

Оператор 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 не вызовет задержку.

debounce

Один из вариантов throtleWithTimeout/debounce (два названия для одного и того же варианта оператора) выполняет задержку через периодические интервалы времени, которые вы выбираете, передавая в оператор TimeUnit и количество таких единиц в качестве параметров.

Этот вариант по умолчанию работает на computation Scheduler, но вы можете в качестве третьего параметра передать Scheduler по своему выбору.

  • Javadoc: throttleWithTimeout(long,TimeUnit) и debounce(long,TimeUnit)
  • Javadoc: throttleWithTimeout(long,TimeUnit,Scheduler) и debounce(long,TimeUnit,Scheduler)
debounce

Существует также вариант debounce (у которого нет псевдонима throttleWithTimeout), который выполняет задержку исходного Observable, применяя функцию к каждому излучаемому элементу, эта функция генерирует Observable. Если исходный Observable излучает другой элемент до завершения этого вновь сгенерированного Observable, debounce будет подавлять этот элемент.

Этот вариант debounce по умолчанию не работает на каком-либо конкретном Scheduler.

  • Javadoc: debounce(Func1)

RxJava 1․x debounce throttleWithTimeout

RxJava реализует этот оператор как throttleWithTimeout и debounce.

Обратите внимание, что последний элемент, излученный исходным Observable, будет излучен в свою очередь этим оператором, даже если уведомление onCompleted исходного Observable издано в течение заданного интервала времени с момента излучения этого элемента. То есть: уведомление onCompleted не вызовет задержку.

debounce

Один из вариантов throtleWithTimeout/debounce (два названия для одного и того же варианта оператора) выполняет задержку через периодические интервалы времени, которые вы выбираете, передавая в оператор TimeUnit и количество таких единиц в качестве параметров.

Этот вариант по умолчанию работает на computation Scheduler, но вы можете в качестве третьего параметра передать Scheduler по своему выбору.

  • Javadoc: throttleWithTimeout(long,TimeUnit) и debounce(long,TimeUnit)
  • Javadoc: throttleWithTimeout(long,TimeUnit,Scheduler) и debounce(long,TimeUnit,Scheduler)
debounce

Существует также вариант debounce (у которого нет псевдонима throttleWithTimeout), который выполняет задержку исходного Observable, применяя функцию к каждому излучаемому элементу, эта функция генерирует Observable. Если исходный Observable излучает другой элемент до завершения этого вновь сгенерированного Observable, debounce будет подавлять этот элемент.

Этот вариант debounce по умолчанию не работает на каком-либо конкретном Scheduler.

  • Javadoc: debounce(Func1)

RxJS debounce debounceWithSelector throttleWithTimeout

debounce

Первый вариант — называемый либо 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

Оператор 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.js
  • rx.all.compat.js
  • rx.time.js (требует rx.js или rx.compat.js)
  • rx.lite.js
  • rx.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API