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


Answers:


214

您要setInterval()

var intervalID = setInterval(function(){alert("Interval reached");}, 5000);

setInterval()的第一个参数也可以是要评估的代码字符串。

您可以使用以下方法清除周期函数:

clearInterval(intervalID);

15
我投票,然后决定取消我的投票(但不放弃投票),因为您在setInterval中使用了字符串参数。为了效率,安全性及其关闭功能,几乎应该始终使用函数以支持字符串参数。
杰森S

5
很好,我不在乎。 setInterval()不管参数如何,都是对问题的正确答案。这只是一个例子,两种方法在定义上都是正确的。
zombat

2
我同意Jason S;它确实应该是一个功能。在您的示例中,唯一的问题是性能损失可以忽略不计,但这是一个坏习惯。
马修·克鲁姆利

4
我同意你们两个,使用功能会更好。我从未说过不是。这两种方法都是正确的,但是为了便于注释,我将编辑答案以包含一个函数。
zombat

37

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

例如。如果您使用setInterval()的时间为1000ms,并且在周期函数中进行了一次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,但在变量中跟踪经过的时间,然后动态设置每次调用的超时延迟,以尽可能接近所需的时间间隔执行函数,但决不要比返回响应快。


setTimeout(myPeriodicMethod,1000); 被称为2次。是否要求?我认为设置超时只能在完整功能中调用
Vishnudev K 2014年

1
是第二的setTimeout()是不是一个要求,你可以简单地调用myPeriodicMethod(),它会立即执行第一个Ajax调用...但如果你想安排它从一个延迟的第一个打电话给你可以把它写成我已经写了。
Matt Coubrough 2014年

16

每个人都已经有一个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
+1如果您是Crockford JavaScript学校的学生,请避免以各种邪恶的形式进行评估。
2009年

@Patrick-我认为“不要在名称中使用$(美元符号)或\(反斜杠)”的建议与jQuery一起使用时会很好:)
Russ Cam

6

还是老问题了。我还需要一个定期的任务执行器并编写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中均可使用。有关所有功能,请参阅文档




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);
}


1

本机方式确实是setInterval()/ clearInterval(),但是如果您已经在使用Prototype库,则可以利用PeriodicalExecutor:

new PeriodicalUpdator(myEvent, seconds);

这样可以防止通话重叠。从http://www.prototypejs.org/api/periodicalExecuter

“如果执行时间比给定的时间间隔长,它可以使您避免多次并行执行回调函数(它会维护一个内部的“运行中”标志,该标志可以屏蔽回调函数中的异常)。如果您执行此操作,则特别有用在给定的时间间隔内使用一个与用户互动(例如使用提示或确认呼叫):这将避免多个消息框等待所有操作。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.