我有一连串的中断进入处理程序,我不想在上次中断后 5 毫秒之前为它们服务,这表明混乱已经结束。
我的想法是在setTimeout(LookAtInterrupts, 5)
每次输入处理程序时调用,但我没有在setTimeout()
文档中看到如果在执行发生之前调用它,它将取消挂起的预定调用。
事实上,它会这样做吗?我不想在每次处理程序中断后 5ms 被调用,只是最后一个。
我有一连串的中断进入处理程序,我不想在上次中断后 5 毫秒之前为它们服务,这表明混乱已经结束。
我的想法是在setTimeout(LookAtInterrupts, 5)
每次输入处理程序时调用,但我没有在setTimeout()
文档中看到如果在执行发生之前调用它,它将取消挂起的预定调用。
事实上,它会这样做吗?我不想在每次处理程序中断后 5ms 被调用,只是最后一个。
不,它不会 - 您可以拥有任意数量的未决超时。
该函数返回一个可用于稍后取消超时的键:
var key = setTimeout( ... );
然后稍后取消它:
clearTimeout(key);
使用已经过期的密钥调用clearTimeout()
不是错误,因此您不必担心同步问题。
setTimeout
不会自行重置。
您可以通过手动重置超时
var timeout = setTimeout(...);
clearTimeout(timeout);
AsetTimeout()
不会隐式取消任何先前的超时。
但是,您可以通过将标识符存储在变量中并每次清除它来实现。
var timeoutId = null;
var yourFn = function() {
clearTimeout(timeoutId);
timeoutId = setTimeout(fn, 5);
};
您需要存储参考。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/ 旋转超时的成本)。
将对该 setTimeout 调用的引用存储在变量中,并在每次成功中断后,在创建超时之前,取消先前的超时,
var tv = null;
function interrupt(){
if(tv !== null){
clearTimeout(tv);
}
tv = setTimeout(LookAtInterrupts,5)
}
function LookAtInterrupts(){
}
这样,您将保证只有最后一个中断会以 5ms 的间隔继续执行。我希望这很清楚。
虽然您可以自己实现它,但更实际的解决方案是获取 underscore.js 并使用它的 debounce 功能(请参阅http://underscorejs.org/#debounce)。
然后你可以这样做:
var lookAtInterrupts = _.debounce(handleInterrupt, 5);
结果函数最多每 5 毫秒运行一次。
执行时setTimeout()
,它会安排一次调用您的 bind function()
。
如果你想取消它,你必须得到返回的 IDsetTimeout()
并清除为:
var timeOutID = setTimeout( LookAtInterrupts, 5 );
(...)
clearTimeOut( timeOutID );