web-dev-qa-db-fra.com

Comment démarrer la boucle setInterval immédiatement?

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

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);
112
Salman A

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.

18
alex

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);
}
17
Richard

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