高效的异步过滤器

时间:2017-01-08 21:08:37

标签: javascript jquery performance

我有一个计算量很大的代码段,它通过DOM操作执行数据集的过滤。我将其设为异步,以确保大量适合项目的可接受性能:

person

问题在于此部分可能会在每个用户输入更改时运行,但只有最后一个的结果才有意义。所以,我的问题是,是否有办法取消执行重计算部分的先前“线程”并只执行最新的?

我到目前为止最好的想法是使用某种信号量(可能是$ .Deferred)并尝试减少临界区。

1 个答案:

答案 0 :(得分:2)

如果您只需要最终结果,请使用debounced事件处理程序。这是一个示例debounce implementation,但网络上还有其他一些。

使用debounce包装事件处理程序将阻止事件处理程序触发,只要它被重复调用即可。只有在调用处理程序时,处理程序才会触发,然后它会在一段时间内空闲。

.on('input', debounce(function {
    // heavy computation
}, 500)) // wait 500ms before firing the handler

在示例中连续输入并停止,您将看到控制台只会记录一词一次:



var debounce = function(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this,
            args = arguments;
        var later = function() {
            timeout = null;
            if ( !immediate ) {
                func.apply(context, args);
            }
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait || 200);
        if ( callNow ) { 
            func.apply(context, args);
        }
    };
};

$('#input').on('input', debounce(function() {
  console.log('called');
}));

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="input">
&#13;
&#13;
&#13;