【发布时间】:2010-11-16 12:06:09
【问题描述】:
有没有办法在 JavaScript 中定期调用函数?
【问题讨论】:
标签: javascript dom-events
有没有办法在 JavaScript 中定期调用函数?
【问题讨论】:
标签: javascript dom-events
setInterval()方法,重复调用一个函数或者执行一段代码sn-p,每次调用之间有固定的时间延迟。它返回一个唯一标识间隔的间隔 ID,因此您可以稍后通过调用 clearInterval() 将其删除。
var intervalId = setInterval(function() {
alert("Interval reached every 5s")
}, 5000);
// You can clear a periodic function by uncommenting:
// clearInterval(intervalId);
【讨论】:
setInterval() 是问题的正确答案,无论参数如何。这只是一个示例,根据定义,这两种方法都是正确的。
setInterval在第一次调用给定函数之前会等待间隔时间。
老问题但是.. 我还需要一个定期任务运行器并写了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 在浏览器和 Node 中都可以使用。有关所有功能,请参阅 documentation。
【讨论】:
请注意,setInterval() 通常不是定期执行的最佳解决方案 - 它真的取决于您实际定期调用的 javascript。
例如。如果您使用 setInterval() 的周期为 1000 毫秒,并且在周期函数中进行 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,但在变量中跟踪经过的时间,然后动态设置每次调用的超时延迟,以尽可能接近所需的时间间隔执行函数,但速度永远不会超过您获得响应的速度。
【讨论】:
原生方式确实是setInterval()/clearInterval(),但如果你已经在使用Prototype库,你可以利用PeriodicExecutor:
new PeriodicalUpdator(myEvent, seconds);
这可以防止重叠调用。来自http://www.prototypejs.org/api/periodicalExecuter:
“它可以保护你免受回调函数的多个并行执行,如果它需要比给定的时间更长的时间来执行(它维护一个内部的“运行”标志,它可以屏蔽回调函数中的异常)。这尤其是如果您使用一个以给定的时间间隔与用户交互(例如使用提示或确认呼叫),这将很有用:这将避免多个消息框都等待被操作。"
【讨论】:
每个人都已经有了 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 and setTimeout 在特定时间执行代码。 setInterval 将用于定期执行代码。
查看demo and answer here 了解使用情况
【讨论】:
function test() {
alert('called!');
}
var id = setInterval('test();', 10000); //call test every 10 seconds.
function stop() { // call this to stop your interval.
clearInterval(id);
}
【讨论】:
由于您希望函数定期执行,请使用setInterval
【讨论】:
你会想看看 setInterval() 和 setTimeout()。
【讨论】: