18

RxJS Observable 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 バージョン.

このコードは、クリックの速度に関係なく、1 秒に 1 回クリックを出力すると予想していました。代わりに、ランダムな間隔であると思われるクリックを出力します。

4

3 に答える 3

20

デバウンスは、別の値が発行されずに指定された時間間隔が経過した後に値を発行します。

簡単な図を使用すると、以下がより役立つ場合があります。

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 myfile.js  (where the aforementioned code is in myfile.js)

このノード プログラムが開始されると、コンソールで値を入力できます。すばやく入力すると項目は無視され、断続的に入力すると、コンソールで入力のギャップの後に速くて遅い項目が表示されます (上記の例では 500 ミリ秒あります)。 ("次: ")

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.mdにもいくつかの優れた参考資料があります。

于 2015-06-15T18:02:54.727 に答える
9

簡単に言うと、デバウンスは、ストリームが新しい値を発行していない X 時間待ってから、最新の値を渡します。

長い話: 値が発行されると、debounce はその発行を X 時間一時停止して、別の値が発行されているかどうかを確認します。実際、この間ストリームをブロックします。デバウンス時間中に新しい値が発行された場合、タイマーが再起動され、デバウンスは再び全時間待機します。新しい値が発行されずにタイマーが期限切れになると、最新の値が渡されます。

入力ボックスにオートコンプリートを追加したいとしましょう。ユーザーが "a" を挿入した場合、"acorn, alaska" という選択肢を表示したいかもしれませんが、ユーザーが "l" を押した直後に "alaska" だけを提案します。この場合、不必要な作業を避けるために、ユーザーがキーボードを押すのをやめるのを待つ方がよいでしょう。デバウンス これは適切なツールです: ストリームが新しい値を放出しないのを X 時間待ちます

于 2016-12-03T14:15:35.217 に答える
5

.debounce()指定された間隔内に値が受信されなかった場合、最後に受信された値を生成します。

これは、1 秒以内にクリックするとすぐに、何も生成されないことを意味します。

値を毎秒より頻繁に発行しないように調整したい場合は、.sample(1000)代わりに使用する必要があります。

于 2015-06-15T08:30:39.067 に答える