【发布时间】:2013-10-02 20:00:34
【问题描述】:
我有一系列中断进入处理程序,我不想在上次中断后 5 毫秒之前为它们服务,这表明中断已经结束。
我的想法是在每次输入处理程序时调用setTimeout(LookAtInterrupts, 5),但我在setTimeout() 文档中没有看到如果在执行发生之前调用它会取消挂起的预定调用。
事实上,它会做什么?我不想在每个处理程序中断后 5 毫秒被调用,只是最后一个。
【问题讨论】:
标签: javascript
我有一系列中断进入处理程序,我不想在上次中断后 5 毫秒之前为它们服务,这表明中断已经结束。
我的想法是在每次输入处理程序时调用setTimeout(LookAtInterrupts, 5),但我在setTimeout() 文档中没有看到如果在执行发生之前调用它会取消挂起的预定调用。
事实上,它会做什么?我不想在每个处理程序中断后 5 毫秒被调用,只是最后一个。
【问题讨论】:
标签: javascript
不,它不会 - 您可以根据需要设置任意多个未决超时。
该函数返回一个键,您可以在以后使用它来取消超时:
var key = setTimeout( ... );
然后再取消:
clearTimeout(key);
使用已经过期的密钥调用clearTimeout() 不会出错,因此您不必担心同步问题。
【讨论】:
setTimeout 不会自行重置。
您可以手动重置超时
var timeout = setTimeout(...);
clearTimeout(timeout);
【讨论】:
setTimeout() 不会隐式取消任何以前的超时。
但是,您可以通过将标识符存储在变量中并每次清除它来实现。
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);
参考资料:
顺便说一句,be careful 在设置超时
【讨论】:
将对该 setTimeout 调用的引用存储在一个变量中,并在每次成功中断后,在创建超时之前,取消之前的超时,
var tv = null;
function interrupt(){
if(tv !== null){
clearTimeout(tv);
}
tv = setTimeout(LookAtInterrupts,5)
}
function LookAtInterrupts(){
}
这样,您将保证只有最后一个中断会以 5ms 的间隔继续执行。我希望这很清楚。
【讨论】:
虽然您可以自己实现此功能,但更实用的解决方案是获取 underscore.js 并使用它的去抖动功能(请参阅http://underscorejs.org/#debounce)。
那么你可以这样做:
var lookAtInterrupts = _.debounce(handleInterrupt, 5);
生成的函数最多每 5 毫秒运行一次。
【讨论】:
当setTimeout() 被执行时,它会安排一个调用你绑定的function()。
如果你想取消它,你必须得到setTimeout()返回的ID并清除为:
var timeOutID = setTimeout( LookAtInterrupts, 5 );
(...)
clearTimeOut( timeOutID );
【讨论】: