2012-04-08 22 views

回答

6

我假设你正在运行与setInterval沉重的功能,并希望如果前一个没有完成,跳过一个勾号。

然后,而不是

function yourfoo() { 
    // code 
} 

setInterval(yourfoo, 3000); 

做:

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

setTimeout(yourfoo, 3000); 

这保证了未来呼叫没有计划,直到前一个完成。

+0

请记住,如果调用队列中已经有一个setInterval类型的已触发调用将被丢弃。所以如果你不想让代码紧接着执行,如果你的代码需要比指定的超时更长的时间来完成,那么重写就是必要的。否则它并不重要。无论如何:由于JavaScript的单线程特性,您的代码不会同时执行两次。 – koenpeters 2012-04-08 11:30:12

+0

没有下降,只是排队 – Raynos 2012-04-08 11:55:13

+0

那简单的解决方案!非常感谢 – Boos93 2012-04-08 12:20:49

1

是的。

这是默认完成的。

它被称为JavaScript是单线程的。

两个函数不能同时运行。

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

0

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

+0

这是没有必要的。两个功能不能同时运行。你不需要像这样的锁定机制。 – Raynos 2012-04-08 11:08:03

0

JavaScript是单线程的,这意味着在给定的时间只有一个JavaScript块会被执行。所以,即使定时器启动,代码的执行也会排队等待下一个可用时刻。重要的是要知道,如果你使用的是setInterval,只有一个间隔“fire”会被排队,其他所有的间隔将被丢弃,直到队列中没有更多的这种间隔。

这里是如何工作的jQuery的父亲约翰Resig的一个很好的解释:http://ejohn.org/blog/how-javascript-timers-work/

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

所以,做这样的事情,以防止背部到后端执行:

var nrOfMillisecondsToWait = 200; 
setTimeout(function() { 
    .. your code here 
}, nrOfMillisecondsToWait); 
相关问题