如何立即启动 setInterval 循环?

在一个简单的 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);
84729 次浏览

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

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

有时候我会用这种模式。

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


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

这并不完全相同,因为它会等到执行 做点什么之后再等待约9秒钟再调用它。但是,这通常很有用,这样事件队列上的事件就不会堆积起来(尽管有些代码不太可能需要9秒钟才能运行:)

注意,在较老的 IE 中,me将泄漏到外部作用域。

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

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

我使用这个经过消毒的 setInterval版本,它确实立即调用函数,并且在调用函数参数之前花费一些时间(以秒为单位) ,因此使用内联函数定义调用它看起来实际上是合理的。

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