setTimeout()会自行重置吗?

时间:2013-10-02 20:00:35

标签: javascript

我有一连串的中断进入处理程序,我不想为它们提供服务,直到最后一次中断已经过去了5ms,表明乱舞已经结束。

我的想法是每次输入处理程序时调用setTimeout(LookAtInterrupts, 5),但我没有在setTimeout()文档中看到,如果在执行之前调用它,它将取消挂起的调度调用。

事实上,这是什么呢?我不希望在每个处理程序中断后调用5ms,只是最后一个。

7 个答案:

答案 0 :(得分:9)

不,它不会 - 您可以拥有任意数量的待处理超时。

该函数返回一个可用于以后取消超时的键:

var key = setTimeout( ... );

然后稍后取消:

clearTimeout(key);

使用已过期的密钥调用clearTimeout()不是错误,因此您不必担心同步问题。

答案 1 :(得分:2)

setTimeout不会自行重置。

您可以通过

手动重置超时
var timeout = setTimeout(...);
clearTimeout(timeout);

答案 2 :(得分:1)

setTimeout()不会隐式取消任何先前的超时。

但是,您可以通过将标识符存储在变量中并每次清除它来实现这一目的。

var timeoutId = null;
var yourFn = function() { 
     clearTimeout(timeoutId);
     timeoutId = setTimeout(fn, 5);
};

答案 3 :(得分:1)

您需要存储参考。 setTimeout结果可以在以后存储和清除。

对于“可重置”setTimeout

// first assign it
var timeout = setTimeout(function(){
  foo();
}, 50);

// then look for an existing assignment before re-assinging
if (timeout) clearTimeout(timeout);
timeout = setTimeout(function(){
  bar();
}, 50);

参考文献:

除此之外,be careful设置超时时间< 5ms的。虽然HTML5应该支持4,但我怀疑你实际上已经接近那个(带有调整超时的成本)。

答案 4 :(得分:0)

在变量中存储对该setTimeout调用的引用,并在每次成功中断之后,在创建超时之前,取消之前的超时,

var tv = null;

function interrupt(){
    if(tv !== null){
        clearTimeout(tv);
    }
    tv = setTimeout(LookAtInterrupts,5)
}

function LookAtInterrupts(){

}

通过这种方式,您可以保证只有最后一个中断将以5ms的间隔继续执行。我希望这很清楚。

答案 5 :(得分:0)

虽然您可以自己实现,但更实际的解决方案是获取underscore.js并使用它的去抖功能(参见http://underscorejs.org/#debounce)。

然后你可以这样做:

var lookAtInterrupts = _.debounce(handleInterrupt, 5);

结果函数最多每5 ms运行一次。

答案 6 :(得分:0)

执行setTimeout()时,会安排对绑定的function()进行一次调用。

如果您想取消它,您必须获得setTimeout()返回的ID并清除为:

var timeOutID = setTimeout( LookAtInterrupts, 5 );
(...)
clearTimeOut( timeOutID );