我有一个javascript函数function a()
,我想每10秒执行一次。
我发现我可以使用setInterval
,这样我就可以执行以下操作:setInverval(a, 10000);
我的问题如下:
这是否意味着
i) 每 10 秒调用一次指定的函数(无论之前的执行是否正在运行/多线程方式)或
ii) 调用该函数,当该函数完成执行后,该函数的下一次调用计划在 10 秒后?
我基本上对选项 2 感兴趣。如果选项 1 是默认发生的事情,那么我如何实现选项 2?
基本上,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 的单线程性质,该函数也永远不会并发运行。
setInterval(a, 10000)
计划每 10 秒调用一次函数,无论它之前的调用完成时间如何。如果要将下一次调用安排在最后一次调用完成后的 10 秒内,则应在 a
函数本身中调用setTimeout(a, 10000)
,而不是使用 setInterval
。