用例


我有一个人或组的列表(如FB Messenger中的列表)(左窗格)
当我切换人时,我会加载消息(API调用)。
如果我快速按下向下箭头,则不是要对每个人都进行API调用,我只想加载我暂停并等待的人。
目前,我正在对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);
}



问题


当我在Message1时-已加载M1详细信息
当我快速按下按键时-M2将加载,然后下一条消息将发生反跳动)


我想避免这种M2负载。我不确定是否可以在同一流程中同时使用反跳和非反跳

最佳答案

而不是“去抖动”,您可能正在寻找可以触发超时并等待设置的持续时间的函数,然后使用传入的最后一个参数调用该函数。这是一个快速的'n'dirty缓冲函数(未经测试):

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);
        }
    }
}


编辑:忘记清除缓冲区变量

09-25 19:05