我有一段计算量很大的代码,它通过DOM操作对数据集执行过滤。为了确保大量fiter项的可接受性能,我使其具有异步性:
.on('input', function {
setTimeout(function(){
// heavy computation
}, 0)
})
问题是,这个部分可能运行在每个用户输入的更改上,但只有最后一个部分的结果才是有意义的。那么,我的问题是,是否有一种方法可以取消以前的“线程”执行繁重的计算部分,而只执行最新的?
到目前为止,我最好的想法是使用某种信号量(可能是$.Deferred),并尽量减少关键部分。
发布于 2017-01-08 21:15:29
如果只需要最终结果,请使用debounced
事件处理程序。这是一个示例取消实施,但是网络上还有其他的。
使用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">
https://stackoverflow.com/questions/41537927
复制相似问题