如何立即启动setInterval循环?

时间:2012-05-12 11:34:50

标签: javascript jquery setinterval

简单setInterval

setInterval(function() {
      // Do something every 9 seconds
}, 9000);

第一个动作将在9秒后发生(t=9s)。如何强制循环立即执行第一个操作(t=0)?

我认为这是由于setInterval具有Delay - Action - Delay - Action ...循环的机制;而不是Action - Delay - Action - Delay ...循环。

编辑:我的功能确实是一个循环

setInterval(function(){
$('.test').each(function(idx){
    var duration = 1000;
    $(this).delay(duration*idx);
    Some stuff here
});
}, 4000);

4 个答案:

答案 0 :(得分:100)

保持简单。您可以使用命名函数而不是匿名函数;叫它并为它设置一个间隔。

function doSomething() {
    console.log("tick");
}
doSomething();
setInterval(doSomething, 9000);

根据需要创建范围:

(function() {
    function doSomething() {
        console.log("tick");
    }
    doSomething();
    setInterval(doSomething, 9000);
})();

最后,以下工作无需创建或影响x

setInterval(function x() {
    console.log("tick");
    return x;
}(), 9000);

答案 1 :(得分:18)

有时我会使用这种模式...

(function me() {
    // Do something every 9 seconds

    setTimeout(me, 9000);
})();

它不完全相同,因为它会等待执行某些操作,然后再等待~9秒再次调用它。但是,这通常很有用,因此事件队列上的事件不会不必要地堆叠(但不太可能是某些代码需要9秒才能运行:)

请注意,在较旧的IE中,me会泄漏到外部范围。

答案 2 :(得分:17)

setInterval()是一个非常丑陋的函数。我使用这个清理版本,它会立即调用该函数,并在几秒钟内花费时间,在函数参数之前,因此使用内联函数定义调用它实际上看起来很合理。

function startInterval(seconds, callback) {
  callback();
  return setInterval(callback, seconds * 1000);
}

答案 3 :(得分:2)

使用命名函数并调用它并将其分配给间隔。

var myFnc = function() {
    // Do something every 9 seconds
};
setInterval(myFnc, 9000);
myFnc();

另一种选择是使用setTimeout。

var myFnc = function() {
    // Do something every 9 seconds
    setTimeout(myFnc, 9000);
};
myFnc();