Dans un simple setInterval
setInterval(function() {
// Do something every 9 seconds
}, 9000);
La première action aura lieu après 9 secondes (t=9s
). Comment forcer la boucle à exécuter immédiatement la première action (t=0
)?
Je pense que c'est dû au mécanisme de setInterval
d'avoir Delay - Action - Delay - Action ...
boucle; au lieu de Action - Delay - Action - Delay ...
boucle.
EDIT: Ma fonction est en effet une boucle comme
setInterval(function(){
$('.test').each(function(idx){
var duration = 1000;
$(this).delay(duration*idx);
Some stuff here
});
}, 4000);
Rester simple. Vous pouvez utiliser une fonction nommée au lieu d'une fonction anonyme; appelez-le et définissez un intervalle pour cela.
function doSomething() {
console.log("tick");
}
doSomething();
setInterval(doSomething, 9000);
Créez une portée si nécessaire:
(function() {
function doSomething() {
console.log("tick");
}
doSomething();
setInterval(doSomething, 9000);
})();
Enfin, ce qui suit fonctionne sans créer ni affecter x
:
setInterval(function x() {
console.log("tick");
return x;
}(), 9000);
Parfois j'utilise ce modèle ...
(function me() {
// Do something every 9 seconds
setTimeout(me, 9000);
})();
Ce n'est pas tout à fait la même chose, car il attendra que faire quelque chose soit exécuté avant d'attendre environ 9 secondes pour l'appeler à nouveau. Mais, cela est souvent utile, donc les événements de la file d'attente d'événements ne se cumulent pas inutilement (mais il est peu probable que le code prenne 9 secondes à exécuter :)
Notez que dans les IE plus anciens, le me
fuira dans la portée extérieure.
setInterval () est une fonction vraiment moche. J'utilise cette version aseptisée, qui appelle la fonction immédiatement et prend un certain temps en secondes, AVANT le paramètre de la fonction, donc l'appeler avec une définition de fonction en ligne semble en fait judicieux.
function startInterval(seconds, callback) {
callback();
return setInterval(callback, seconds * 1000);
}
Utilisez une fonction nommée et appelez-la et affectez-la à l'intervalle.
var myFnc = function() {
// Do something every 9 seconds
};
setInterval(myFnc, 9000);
myFnc();
L'autre option consiste à utiliser setTimeout à la place.
var myFnc = function() {
// Do something every 9 seconds
setTimeout(myFnc, 9000);
};
myFnc();