81

在一个简单的setInterval

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

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

我认为这是由于setIntervalDelay - 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

4 回答 4

166

把事情简单化。您可以使用命名函数而不是匿名函数;调用它并为其设置间隔。

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);
于 2012-05-12T11:37:03.500 回答
24

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

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

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

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

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

于 2012-05-12T11:38:21.797 回答
21

setInterval() 是一个非常丑陋的函数。我使用这个经过净化的版本,它会立即调用该函数,并且在函数参数之前需要以秒为单位的时间,因此使用内联函数定义调用它实际上看起来很明智。

function startInterval(seconds, callback) {
  callback();
  return setInterval(callback, seconds * 1000);
}
于 2013-12-20T14:38:35.357 回答
3

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

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();
于 2012-05-12T11:38:49.110 回答