3

我有一个每 3 秒运行一次的 javascript 函数,如果该函数的前一个实例已经在运行,有什么方法可以不执行任何操作吗?

4

4 回答 4

10

我假设您正在运行繁重的功能,setInterval并且如果前一个未完成,则希望跳过一个刻度。

然后,而不是

function yourfoo() {
   // code
}

setInterval(yourfoo, 3000);

做:

function yourfoo() {
   // code
   setTimeout(yourfoo, 3000);
}

setTimeout(yourfoo, 3000);

这保证了在前一个呼叫完成之前不会安排下一个呼叫。

于 2012-04-08T10:55:32.970 回答
0

是的。

这是默认完成的。

它被称为 JavaScript 是单线程的。

两个函数不能同时运行。

您可能使用setIntervalwhich 将在内部缓冲函数调用,直到任何当前正在运行的代码完成。

于 2012-04-08T10:54:46.247 回答
0

您可以定义一个布尔标志来指示函数在更高范围内的运行状态,并相应地打开或关闭它。

于 2012-04-08T10:59:20.153 回答
0

JavaScript 是单线程的,这意味着在给定时间只会执行一个 JavaScript 块。因此,即使计时器触发,代码的执行也会排队等待下一个可用时刻。重要的是要知道,如果您使用 setInterval,则只有一个“触发”间隔将排队,而所有其他间隔将被丢弃,直到队列中不再有此类间隔。

这是 jQuery 的父亲 John Resig 对它的工作原理的一个很好的解释:http: //ejohn.org/blog/how-javascript-timers-work/

您可以重写代码以使用 setTimeout,因为这样可以保证代码的下一次执行只会在至少等待规定的毫秒数后才会发生(如果执行被阻止,可能会更长)。如果代码需要很长时间才能完成,则使用 setInterval 阻塞可能会导致代码的背靠背执行。

所以,做这样的事情来防止背靠背执行:

var nrOfMillisecondsToWait = 200;
setTimeout(function() {
  .. your code here
}, nrOfMillisecondsToWait);
于 2012-04-08T11:25:18.357 回答