0

如果我使用 setInterval 函数每 X 秒调用一次异步 JavaScript 函数,间隔将在上一次执行完成后等待 X 秒还是在上一次执行被调用后等待 X 秒?例如,如果我显示呼叫的时间线是:

0 秒:setInterval(funcX, 10000)
10 秒:funcX - 需要 3 秒执行 20 秒:funcX

或者

0 秒:setInterval(funcX, 10000)
10 秒:funcX - 需要 3 秒执行 23 秒:funcX

4

2 回答 2

2

取自Mozilla 文档

重复调用函数或执行代码片段,每次调用该函数之间有固定的时间延迟。

因此,它是每 X 秒。但是如果函数的执行时间超过 X 秒,那么线程将被锁定并在空闲时执行。

有关JavaScript计时的更多信息,我推荐 John Resig 的文章How JavaScript Timers Work


如果您希望它在函数执行后 X 秒,请在函数setTimeout()末尾使用并调用它:

runFunc();

function runFunc(){
   //code here....
   setTimeout(runFunc, 3000);
}

这将导致无限递归, emulating setInterval(),但只有在当前函数完成执行后才开始 X 秒延迟。

于 2013-02-21T16:11:20.870 回答
0

如果函数实际执行需要 3 秒,那么您就有严重的问题。

这与您并不特别相关,因为您使用的是Ajax,并且实际的 Ajax 调用实际上应该是即时的。

如果您希望在间隔再次继续之前完成 Ajax 调用,这setInterval是不可取的。改为使用setTimeout

function atTime() {
    ajax().done(function () { setTimeout(atTime, 10000); });
}
atTime();
于 2013-02-21T16:17:14.317 回答