防抖動 (Debounce)

只有在特定的時間間隔內沒有發出其他項目時,才從 Observable 發出一個項目

Debounce 運算子會過濾掉來源 Observable 發出的項目,這些項目會緊接著快速發出另一個項目。

另請參閱

各語言特定資訊

待定

待定

RxGroovy 將此運算子實作為 throttleWithTimeoutdebounce

請注意,即使來源 Observable 在您指定的時間視窗內發出了 onCompleted 通知,此運算子仍會依序發出來源 Observable 發出的最後一個項目,因為該項目的發出。也就是說:onCompleted 通知不會觸發節流。

debounce

throtleWithTimeout/debounce(同一個運算子變體的兩個名稱)的一個變體,會在您選擇的週期時間間隔內進行節流,您可以將 TimeUnit 和此類單位的數量作為參數傳遞給運算子。

這個變體預設在 computation 排程器上操作,但您可以選擇性地傳入您選擇的排程器作為第三個參數。

debounce

還有一個 debounce 的變體(沒有 throttleWithTimeout 別名),它通過對發出的每個項目應用一個函數來節流來源 Observable,此函數會產生一個 Observable。如果來源 Observable 在這個新產生的 Observable 終止之前發出另一個項目,debounce 將會抑制該項目。

這個 debounce 變體預設不會在任何特定的 排程器上操作。

RxJava 將此運算子實作為 throttleWithTimeoutdebounce

請注意,即使來源 Observable 在您指定的時間視窗內發出了 onCompleted 通知,此運算子仍會依序發出來源 Observable 發出的最後一個項目,因為該項目的發出。也就是說:onCompleted 通知不會觸發節流。

debounce

throtleWithTimeout/debounce(同一個運算子變體的兩個名稱)的一個變體,會在您選擇的週期時間間隔內進行節流,您可以將 TimeUnit 和此類單位的數量作為參數傳遞給運算子。

這個變體預設在 computation 排程器上操作,但您可以選擇性地傳入您選擇的排程器作為第三個參數。

debounce

還有一個 debounce 的變體(沒有 throttleWithTimeout 別名),它通過對發出的每個項目應用一個函數來節流來源 Observable,此函數會產生一個 Observable。如果來源 Observable 在這個新產生的 Observable 終止之前發出另一個項目,debounce 將會抑制該項目。

這個 debounce 變體預設不會在任何特定的 排程器上操作。

debounce

第一個變體 — 稱為 debouncethrottleWithTimeout — 接受一個持續時間作為其參數,定義為毫秒的整數,並且它會抑制在該持續時間內自第一個項目發出以來,後續有其他發出項目的任何發出項目。

範例程式碼

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

debouncedebounceWithSelector 在以下每個發行版中都有:

  • rx.all.js
  • rx.all.compat.js
  • rx.time.js (需要 rx.jsrx.compat.js)
  • rx.lite.js
  • rx.lite.compat.js

RxPHP 將此運算子實作為 throttle

返回一個 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!
    

待定