如果我使用 setInterval 函数每 X 秒调用一次异步 JavaScript 函数,间隔将在上一次执行完成后等待 X 秒还是在上一次执行被调用后等待 X 秒?例如,如果我显示呼叫的时间线是:
0 秒:setInterval(funcX, 10000)
10 秒:funcX - 需要 3 秒执行 20 秒:funcX
或者
0 秒:setInterval(funcX, 10000)
10 秒:funcX - 需要 3 秒执行 23 秒:funcX
如果我使用 setInterval 函数每 X 秒调用一次异步 JavaScript 函数,间隔将在上一次执行完成后等待 X 秒还是在上一次执行被调用后等待 X 秒?例如,如果我显示呼叫的时间线是:
0 秒:setInterval(funcX, 10000)
10 秒:funcX - 需要 3 秒执行 20 秒:funcX
或者
0 秒:setInterval(funcX, 10000)
10 秒:funcX - 需要 3 秒执行 23 秒:funcX
取自Mozilla 文档:
重复调用函数或执行代码片段,每次调用该函数之间有固定的时间延迟。
因此,它是每 X 秒。但是如果函数的执行时间超过 X 秒,那么线程将被锁定并在空闲时执行。
有关JavaScript计时的更多信息,我推荐 John Resig 的文章How JavaScript Timers Work。
如果您希望它在函数执行后 X 秒,请在函数setTimeout()
末尾使用并调用它:
runFunc();
function runFunc(){
//code here....
setTimeout(runFunc, 3000);
}
这将导致无限递归, emulating setInterval()
,但只有在当前函数完成执行后才开始 X 秒延迟。
如果函数实际执行需要 3 秒,那么您就有严重的问题。
这与您并不特别相关,因为您使用的是Ajax,并且实际的 Ajax 调用实际上应该是即时的。
如果您希望在间隔再次继续之前完成 Ajax 调用,这setInterval
是不可取的。改为使用setTimeout
。
function atTime() {
ajax().done(function () { setTimeout(atTime, 10000); });
}
atTime();