在Javascript中组合延迟函数调用

Jer*_*oen 6 javascript jquery javascript-events settimeout node.js

我不太清楚这个技术术语是什么.我有一个带有交互式图形的GUI.用户与GUI交互后,我需要执行一些CPU密集型操作.但是,用户输入非常频繁,所以我只想在没有用户输入的1000ms之后调用该函数.在我使用的模式下面:

scheduler = (function(){
    var timer;
    function exec(call, delay){
        clearTimeout(timer);
        timer = setTimeout(call, delay);
    };
    return exec;
})()
Run Code Online (Sandbox Code Playgroud)

即如果3次调用scheduler是在彼此之后完成的,那么实际上只会执行最后一次调用:

scheduler(function(){alert('foo')}, 1000);
scheduler(function(){alert('bar')}, 1000);
scheduler(function(){alert('zoo')}, 1000);
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但感觉有点hacky我有点担心Javascript的任何警告setTimeout,尤其是范围问题.这看起来像我可以在更大范围内使用的可靠模式吗?我传递的内联函数scheduler是否能像往常一样在其词法范围内查找所有对象settimeout?如果我有几个这样的调度程序实例呢?他们会互相干扰吗?有没有其他方法来实现这一目标?

Jer*_*oen 1

underscore.js 中的函数正是这样做的debounce

去抖 _.debounce(function, wait, [immediate])

创建并返回所传递函数的新去抖版本,该版本将推迟其执行,直到自上次调用以来经过等待毫秒后。对于实现仅应在输入停止到达后发生的行为很有用。例如:渲染 Markdown 注释的预览、在窗口停止调整大小后重新计算布局等。