1

我有一连串的中断进入处理程序,我不想在上次中断后 5 毫秒之前为它们服务,这表明混乱已经结束。

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

事实上,它会这样做吗?我不想在每次处理程序中断后 5ms 被调用,只是最后一个。

4

7 回答 7

9

不,它不会 - 您可以拥有任意数量的未决超时。

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

var key = setTimeout( ... );

然后稍后取消它:

clearTimeout(key);

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

于 2013-10-02T20:02:43.030 回答
2

setTimeout不会自行重置。

您可以通过手动重置超时

var timeout = setTimeout(...);
clearTimeout(timeout);
于 2013-10-02T20:02:42.717 回答
1

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

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

var timeoutId = null;
var yourFn = function() { 
     clearTimeout(timeoutId);
     timeoutId = setTimeout(fn, 5);
};
于 2013-10-02T20:02:53.797 回答
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);

参考:

顺便说一句,设置超时 < 5ms 时要小心。尽管 HTML5 应该支持 4,但我怀疑您实际上是否接近该值(w/ 旋转超时的成本)。

于 2013-10-02T20:03:32.627 回答
0

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

var tv = null;

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

function LookAtInterrupts(){

}

这样,您将保证只有最后一个中断会以 5ms 的间隔继续执行。我希望这很清楚。

于 2013-10-02T20:03:52.753 回答
0

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

然后你可以这样做:

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

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

于 2013-10-02T20:06:40.413 回答
0

执行时setTimeout(),它会安排一次调用您的 bind function()

如果你想取消它,你必须得到返回的 IDsetTimeout()并清除为:

var timeOutID = setTimeout( LookAtInterrupts, 5 );
(...)
clearTimeOut( timeOutID );
于 2013-10-02T20:06:40.990 回答