432 votes

Exécutez la première fois le setInterval sans délai

C’est là une manière de configurer le `` méthode de javascript pour exécuter la méthode immédiatement, puis l’exécute avec la minuterie

629voto

Alnitak Points 143355

Il est plus simple de simplement appeler la fonction directement la première fois:

foo();
setInterval(foo, delay);

Cependant, il existe de bonnes raisons pour éviter setInterval - en particulier dans certaines circonstances, un chargement entier de setInterval événements peuvent arriver immédiatement les uns après les autres sans aucun retard. Une autre raison est que si vous voulez arrêter la boucle que vous avez à appeler explicitement clearInterval ce qui signifie que vous devez vous rappeler le handle retourné à partir de l'original setInterval appel.

Si une autre méthode est de disposer d' foo déclencheur lui-même pour la suite des appels à l'aide de setTimeout à la place:

function foo() {
   // do stuff
   // ...

   // and schedule a repeat
   setTimeout(foo, delay);
}

// start the cycle
foo();

Cela garantit qu'il existe au moins un intervalle de delay entre les appels. Il rend également plus facile pour annuler la boucle si nécessaire - il suffit de ne pas appeler à l' setTimeout lors de votre boucle de résiliation condition est atteinte.

Mieux encore, vous pouvez envelopper ce tout en un immédiatement appelé expression de fonction qui crée la fonction qui appelle lui-même à nouveau comme ci-dessus, et commence automatiquement la boucle:

(function foo() {
    ...
    setTimeout(foo, delay);
})();

qui définit la fonction et commence le cycle en entier.

240voto

chjj Points 5676

Je ne sais pas si je vous comprends bien, mais vous pourriez facilement faire quelque chose comme ceci :

Il n’y a évidemment un certain nombre de façons de le faire, mais c’est la façon plus concise, que je peux penser.

9voto

user113716 Points 143363

Vous pouvez encapsuler `` dans une fonction qui fournit ce comportement :

.. .alors l’utiliser comme ceci :

5voto

Mahn Points 5565

Voici un wrapper pour la jolie-fy si vous en avez besoin:

(function() {
    var originalSetInterval = window.setInterval;

    window.setInterval = function(fn, delay, runImmediately) {
        if(runImmediately) fn();
        originalSetInterval(fn, delay);
    };
})();

Définissez le troisième argument de la fonction setInterval pour de vrai et ça va fonctionner pour la première fois, immédiatement après setInterval:

setInterval(function() { console.log("hello world"); }, 5000, true);

Ou omettre le troisième argument et il conservera son origine comportement:

setInterval(function() { console.log("hello world"); }, 5000);

Certains navigateurs prennent en charge des arguments supplémentaires pour setInterval qui ce wrapper ne prend pas en compte; je pense que ce sont rarement utilisés, mais gardez cela à l'esprit si vous avez besoin d'eux.

1voto

Justin Ethier Points 57486

Si vous extrayez le code vous passez à dans une fonction, vous pouvez appeler la fonction directement immédiatement après avoir appelé . Cela permet d’obtenir le même effet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X