首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >高效异步滤波器

高效异步滤波器
EN

Stack Overflow用户
提问于 2017-01-08 21:08:37
回答 1查看 64关注 0票数 3

我有一段计算量很大的代码,它通过DOM操作对数据集执行过滤。为了确保大量fiter项的可接受性能,我使其具有异步性:

代码语言:javascript
运行
复制
.on('input', function {
    setTimeout(function(){
        // heavy computation
    }, 0)
})

问题是,这个部分可能运行在每个用户输入的更改上,但只有最后一个部分的结果才是有意义的。那么,我的问题是,是否有一种方法可以取消以前的“线程”执行繁重的计算部分,而只执行最新的?

到目前为止,我最好的想法是使用某种信号量(可能是$.Deferred),并尽量减少关键部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-08 21:15:29

如果只需要最终结果,请使用debounced事件处理程序。这是一个示例取消实施,但是网络上还有其他的。

使用debounce包装事件处理程序将防止事件处理程序触发,只要它被反复调用。只有当处理程序被调用时,处理程序才会触发,然后它将空闲一段时间。

代码语言:javascript
运行
复制
.on('input', debounce(function {
    // heavy computation
}, 500)) // wait 500ms before firing the handler

在示例中,连续和停止类型中,您将看到控制台只记录名为的单词一次:

代码语言:javascript
运行
复制
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');
}));
代码语言:javascript
运行
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="input">

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41537927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档