帮助在settimeout和setinterval之间进行选择

时间:2011-06-13 15:27:59

标签: javascript jquery settimeout setinterval

更新2:

好的,好像它在一分钟后第一次运行。如何让它运行onload,然后每分钟运行一次?

更新1:

我试过了:var interval = setInterval(get_reported_incidents, 60000);但没有任何反应。在get_reported_incidents();我只有一个alert("hello");

原始问题:

我想每分钟运行一次功能:

get_reported_incidents();

但我不确定哪种方法最适合这项任务;

settimeoutsetinterval

7 个答案:

答案 0 :(得分:3)

这完全是个人偏好。 setInterval有一些奇怪的边缘情况,当前一个间隔的代码在下一个间隔开始之前没有完成运行时会发生什么(如果你的间隔是每隔分钟,则不会出现问题;间隔每一秒,哪一个人有时想要,有点棘手)。

我倾向于选择链式setTimeout来电(其中每个调度都是下一个),因为它们无法与您一起逃跑 - 您的代码总是要明确说“好的,下次再给我回电话”。但正确编写的代码应该可以使用。

链式setTimeout调用也更适合异步操作,例如通过ajax轮询某些内容,因为在ajax操作完成之前,您不会安排下一个超时。使用setInterval,因为ajax调用是异步的,你最终可能会重叠它们。

答案 1 :(得分:1)

使用setinterval将是更自然的选择。如果使用setTimeout,则必须从事件处理程序启动新的超时。

window.setInterval(get_reported_incidents, 60*1000);

答案 2 :(得分:1)

经过一段时间后,

setTimeout会运行一次命令。 setInterval每隔一段时间运行一次命令。

因此,要每分钟运行get_reported_incidents,请使用setInterval

var interval = setInterval(get_reported_incidents, 60000);

答案 3 :(得分:1)

递归使用setTimeout。有关为setInterval选择不当的原因的详细信息,请参阅here

function timeout (){
    get_reported_incidents();
    setTimeout(timeout, 1000 * 60);
}

timeout(); // start

答案 4 :(得分:1)

setinterval以给定间隔执行函数。 settimeout在指定的等待时间后执行一个函数,然后退出。

如果您每分钟尝试执行类似cron的执行,则需要使用setinterval。

请参阅http://javascript.about.com/library/blstvsi.htm进行比较。

答案 5 :(得分:1)

严格地说,setInterval()是为重复事件而设计的,setTimeout()是针对一次性事件而设计的。

然而,你会发现setTimeout()时间会逐渐“蠕动”。我没有以1分钟的间隔尝试这个,但是用1秒计时器我发现它发生了很多。显示当前时间(到最近的毫秒)的时钟将显示“现在”的毫秒值稳定增加。

请参阅http://jsfiddle.net/alnitak/LJCJU/并调整间隔以了解我的意思!

所以,为了最准确,我这样做:

var timerHandler = function() {
    var interval = 60000;
    // do some stuff
    ...

    var now = new Date();
    var delay = interval - (now % interval);
    setTimeout(timerHandler, delay); 
};

如果您希望计时器事件同步与系统上的时钟一起启动,而不是“大约每分钟”某个未指定的时间,这是理想的选择。

答案 6 :(得分:0)

显然setinterval可能更容易维护

get_reported_incidents(); //first call
var interval = setInterval(get_reported_incidents, 60000);

VS

var interval;
function timeout (){
    get_reported_incidents();
    interval=setTimeout(timeout, 60000);
}
timeout();