有没有办法在 JavaScript 中定期调用函数?

有没有办法在 JavaScript 中定期调用函数?

133662 次浏览

是的-看看 ABC0和 setTimeout在特定时间执行代码。SetInterval 将用于定期执行代码。

有关使用方法,请参见 演示和回答在这里

您需要查看 setInterval ()和 setTimeout ()。

这是 不错的教程文章

因为您希望函数执行 周期性的,所以使用 SetInterval

setInterval()方法重复调用函数或执行代码段,每次调用之间有固定的时间延迟。它返回一个唯一标识间隔的间隔 ID,因此您可以稍后通过调用 clearInterval ()删除它。

var intervalId = setInterval(function() {
alert("Interval reached every 5s")
}, 5000);


// You can clear a periodic function by uncommenting:
// clearInterval(intervalId);

详见@SetInterval ()@MDN Web Docs

function test() {
alert('called!');
}
var id = setInterval('test();', 10000); //call test every 10 seconds.
function stop() { // call this to stop your interval.
clearInterval(id);
}

每个人都有一个 setTimeout/setInterval 解决方案。我认为需要注意的是,您可以将函数传递给 setInterval,而不仅仅是字符串。实际上,传递实函数而不是将“求值”到这些函数的字符串可能更“安全”一些。

// example 1
function test() {
alert('called');
}
var interval = setInterval(test, 10000);

或者:

// example 2
var counter = 0;
var interval = setInterval(function() { alert("#"+counter++); }, 5000);

原生的方法确实是 setInterval()/clearInterval(),但是如果您已经在使用 原型机库,那么您可以利用  期刊执行器:

new PeriodicalUpdator(myEvent, seconds);

这样可以防止重叠调用:

如果回调函数的执行时间超过给定的时间间隔(它维护一个内部的“ running”标志,这个标志可以防止回调函数中的异常) ,那么它可以保护您不受回调函数的多次并行执行的影响。如果你每隔一段时间使用一个消息框与用户进行交互(例如,使用提示或确认呼叫) ,这将特别有用: 这将避免多个消息框等待被操作。”

请注意,setInterval ()通常不是周期性执行的最佳解决方案-它的 真的取决于您实际周期性调用的 javascript。

例如。如果你使用周期为1000ms 的 setInterval () ,并且在周期函数中打一个 ajax 调用,偶尔需要2秒钟才能返回,那么在第一个响应返回之前,你将再次打一个 ajax 调用。这通常是不受欢迎的。

许多库都有周期性的方法来防止天真地使用 setInterval 的缺陷,例如 Nelson 给出的 Prototype 示例。

要使用一个包含 jQuery ajax 调用的函数来实现更健壮的周期性执行,可以考虑这样的事情:

function myPeriodicMethod() {
$.ajax({
url: ...,
success: function(data) {
...
},
complete: function() {
// schedule the next request *only* when the current one is complete:
setTimeout(myPeriodicMethod, 1000);
}
});
}


// schedule the first invocation:
setTimeout(myPeriodicMethod, 1000);

另一种方法是使用 setTimeout,但是跟踪变量中的运行时间,然后动态设置每次调用的超时延迟,以尽可能接近所需的间隔执行函数,但是不能快于获得响应的速度。

老问题了,但是。 我还需要一个定期的任务运行程序和写 TaskTimer。当您需要以不同的间隔运行多个任务时,这也很有用。

// Timer with 1000ms (1 second) base interval resolution.
const timer = new TaskTimer(1000);


// Add task(s) based on tick intervals.
timer.add({
id: 'job1',       // unique id of the task
tickInterval: 5,    // run every 5 ticks (5 x interval = 5000 ms)
totalRuns: 10,      // run 10 times only. (set to 0 for unlimited times)
callback(task) {
// code to be executed on each run
console.log(task.id + ' task has run ' + task.currentRuns + ' times.');
}
});


// Start the timer
timer.start();

TaskTimer在浏览器和节点中都可以工作。所有特性参见 文件