我有一个每3秒运行一次的javascript函数,如果函数的前一个实例已经在运行,有没有办法什么都不做?
答案 0 :(得分:7)
我假设您使用setInterval
运行繁重的功能,并且如果前一个尚未完成,则想跳过一个勾号。
然后,而不是
function yourfoo() {
// code
}
setInterval(yourfoo, 3000);
做的:
function yourfoo() {
// code
setTimeout(yourfoo, 3000);
}
setTimeout(yourfoo, 3000);
这保证下一个呼叫在前一个呼叫完成之前不会被安排。
答案 1 :(得分:1)
是。
这是默认完成的。
它被称为JavaScript是单线程的。
两个功能无法同时运行。
您可能正在使用setInterval
,它将在内部缓冲函数调用,直到任何当前正在运行的代码完成。
答案 2 :(得分:0)
你可以定义一个布尔标志来指示更高范围内函数的运行状态,并相应地打开或关闭它。
答案 3 :(得分:0)
JavaScript是单线程的,这意味着在给定时间只会执行一个JavaScript块。因此,即使计时器触发,代码的执行也将排队,直到下一个可用时刻。重要的是要知道,如果您使用的是setInterval,则只有一个间隔“fire”将排队,所有其他间隔将被删除,直到队列中不再有此类型的间隔。
这是jQuery的父亲John Resig如何运作的一个很好的解释:http://ejohn.org/blog/how-javascript-timers-work/
您可以重写代码以使用setTimeout,因为这样可以确保代码的下一次执行仅在等待至少规定的毫秒数后才会发生(如果执行被阻止,可能会更多)。使用setInterval,如果代码需要很长时间才能完成,阻塞可能会导致代码的背靠背执行。
所以,做这样的事情来阻止背靠背执行:
var nrOfMillisecondsToWait = 200;
setTimeout(function() {
.. your code here
}, nrOfMillisecondsToWait);