我有一连串的中断进入处理程序,我不想为它们提供服务,直到最后一次中断已经过去了5ms,表明乱舞已经结束。
我的想法是每次输入处理程序时调用setTimeout(LookAtInterrupts, 5)
,但我没有在setTimeout()
文档中看到,如果在执行之前调用它,它将取消挂起的调度调用。
答案 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 );