0

使用事例

  1. 個人またはグループのリストがあります (FB メッセンジャーのように) (左ペイン)
  2. 人を切り替えると、メッセージを読み込みます (API 呼び出し)。
  3. 下向き矢印をすばやく押すと、各人に対して API 呼び出しを行う代わりに、一時停止して待っている人だけを読み込みます。
  4. 現在、これを達成するために 300ms のデバウンスを行っています。

    handleSwitchKeyEvent: function() {
        if (this.pendingLoad) {
            // Still pending continue to debounce
            clearTimeout(this.pendingLoad);
            fn = this.loadContent;
        } else {
            // No longer pending - So load data immediately
            this.loadContent();
        }
    
        // Delay the load
        this.pendingLoad = setTimeout(function () {
            clearTimeout(this.pendingLoad);
            this.pendingLoad = 0;
            fn && fn.call(this);
        }, 300);
    }
    

問題

  1. Message1 にいるとき - M1 の詳細が読み込まれます
  2. キーをすばやく押すと、M2 がロードされ、次のメッセージでデバウンスが発生します)

この M2 負荷を回避したい。同じフローでデバウンスと非デバウンスを混在させることさえ可能かどうかはわかりません

4

1 に答える 1

1

「デバウンス」の代わりに、おそらくタイムアウトを開始し、渡された最後の引数で関数を呼び出す前に設定された期間待機する何かを探しているでしょう。

function buffer( fn, duration ) {
    // Store a timeout id and last args called with
    var buffer;
    var lastArgs;
    return function( ) {
        // The last args will be used
        lastArgs = arguments;
        // If buffer hasn't started, kick it off
        if (!buffer) {
            buffer = setTimeout(function() {
                // After duration, call the function with args
                // Reset buffer
                fn.apply(null, lastArgs);
                buffer = null;
            }, duration);
        }
    }
}

編集:バッファ変数をクリアするのを忘れました

于 2015-11-18T21:50:02.997 に答える