我有一个计算量很大的代码段,它通过DOM操作执行数据集的过滤。我将其设为异步,以确保大量适合项目的可接受性能:
person
问题在于此部分可能会在每个用户输入更改时运行,但只有最后一个的结果才有意义。所以,我的问题是,是否有办法取消执行重计算部分的先前“线程”并只执行最新的?
我到目前为止最好的想法是使用某种信号量(可能是$ .Deferred)并尝试减少临界区。
答案 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;