有没有办法在JavaScript中定期调用函数?
答案 0 :(得分:189)
您想要setInterval()
:
var intervalID = setInterval(function(){alert("Interval reached");}, 5000);
setInterval()的第一个参数也可以是要评估的代码字符串。
您可以使用以下方法清除周期性功能:
clearInterval(intervalID);
答案 1 :(得分:33)
请注意,setInterval()通常不是定期执行的最佳解决方案 - 真的取决于您实际定期调用的javascript。
例如。如果你使用周期为1000毫秒的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但跟踪变量中的已用时间,然后动态设置每次调用的超时延迟,以尽可能接近所需的时间间隔执行函数,但绝不会比获得响应更快。
答案 2 :(得分:15)
每个人都有一个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);
答案 3 :(得分:3)
是 - 请查看setInterval
and setTimeout
以便在特定时间执行代码。 setInterval将是用于定期执行代码的那个。
查看demo and answer here的使用情况
答案 4 :(得分:3)
您需要查看setInterval()和setTimeout()。
答案 5 :(得分:3)
老问题但是...... 我还需要一个期刊任务跑步者并写下TaskTimer。当您需要在不同的时间间隔上运行多个任务时,这也很有用。
// Timer with 1000ms (1 second) base interval resolution.
var timer = new TaskTimer(1000)
// Add task(s) based on tick intervals.
timer.addTask({
name: 'job1', // unique name 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: function (task) {
// code to be executed on each run
console.log(task.name + ' task has run ' + task.currentRuns + ' times.');
}
});
// Start the timer
timer.start();
TaskTimer
适用于浏览器和Node。有关所有功能,请参阅documentation。
答案 6 :(得分:2)
function test() {
alert('called!');
}
var id = setInterval('test();', 10000); //call test every 10 seconds.
function stop() { // call this to stop your interval.
clearInterval(id);
}
答案 7 :(得分:1)
由于您希望定期执行功能,请使用setInterval
答案 8 :(得分:1)
原生方式确实是setInterval()
/ clearInterval()
,但如果您已经在使用Prototype库,则可以利用PeriodicalExecutor:
new PeriodicalUpdator(myEvent, seconds);
这可以防止重叠呼叫。来自http://www.prototypejs.org/api/periodicalExecuter:
“它可以防止多次并行执行回调函数,如果执行的时间超过给定的时间间隔(它维护一个内部的”运行“标志,它可以屏蔽回调函数中的异常)。如果您使用一个以给定的时间间隔与用户交互(例如使用提示或确认呼叫),这将非常有用:这将避免所有等待操作的多个消息框。“