简单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);
答案 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();