2014-02-22 46 views
2

我有一个javascript函数function a(),我想每10秒执行一次。
我发现我可以使用setInterval,这样我可以这样做:setInverval(a, 10000);
我的问题是:
这是否意味着
我)每10秒指定的函数被调用(不管前面执行正在运行/多线程方式)或
ii)该函数被调用,并且当此函数已完成执行那么函数的下一次调用将在10秒后计划?
我基本上对选项2感兴趣。如果选项1是默认情况下发生的情况,那么我如何实现选项2?Javascript的setInterval块的函数返回?

回答

4

基本上,setInterval根据选项1运行,除了如果函数花费的时间超过间隔时间,它将不会再次触发,直到它完成并达到下一个滴答声。例如,如果您的间隔为1秒,而您的功能需要1.5秒,则它将在2秒钟内运行。

如果你想要的选项2(运行X秒功能完成后)的行为,请拨打setTimeout在你的函数完成,而不是:

setTimeout(function a() { 
    // your own code 
    setTimeout(a, 1000); 
}, 1000); 

这是如何工作的,它首先等待1秒钟,然后调用传递给setTimeout的函数。在函数结束时,函数本身(a是函数的名称)被传递给setTimeout,然后等待另一秒再次调用该函数。这一过程一直持续到JavaScript执行停止或者通过使用clearTimeout来取消超时。

请注意,即使您使用setInterval,由于JavaScript的单线程性质,函数将会同时运行从不

+0

1)基本上我有兴趣确保我的函数没有实例同时运行,但所有函数调用都是串行的。 2)这个递归超时是如何工作的? – Jim

+0

@lanzz是否说相反? – Jim

+0

@Jim:不是,lanzz不是说相反的事情。如果函数需要0.5秒并且间隔为1秒,则该函数仍将每秒调用一次。如果使用'setTimeout'方法,它将每隔1.5秒调用一次。顺便说一句,JavaScript不是多线程的,除非您使用在单独的上下文中运行的web worker(不适用于您的情况)。 –

2

setInterval(a, 10000)调度一个函数,每10秒调用一次,而不管它以前调用完成的时间。如果您想在完成最后一次通话后安排下一次通话时间为10秒,则应在a功能本身内呼叫setTimeout(a, 10000),然后再返回,而不是使用setInterval

+0

基本上我有兴趣确保没有实例我的函数是同时运行的,但所有的函数调用都是串行的。我不清楚它们是否从你的答案中串行 – Jim