200 votes

Exécuter script après un délai spécifique en utilisant JavaScript

Existe-t-il une méthode JavaScript similaire à la méthode jQuery delay() o wait() (pour retarder l'exécution d'un script pendant une durée déterminée) ?

243voto

Marius Points 27452

Juste pour ajouter à ce que tout le monde a dit au sujet de setTimeout : Si vous voulez appeler une fonction avec un paramètre dans le futur, vous devez mettre en place des appels de fonctions anonymes.

Vous devez passer la fonction comme argument pour qu'elle soit appelée plus tard. En fait, cela signifie qu'il ne faut pas mettre de parenthèses derrière le nom. L'exemple suivant appelle l'alerte en une seule fois et affiche "Hello world" :

var a = "world";
setTimeout(alert("Hello " + a), 2000);

Pour résoudre ce problème, vous pouvez soit mettre le nom d'une fonction (comme l'a fait Flubba), soit utiliser une fonction anonyme. Si vous devez passer un paramètre, alors vous devez utiliser une fonction anonyme.

var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";

Mais si vous exécutez ce code, vous remarquerez qu'au bout de 2 secondes, la fenêtre contextuelle dira "Hello Stack Overflow". Cela est dû au fait que la valeur de la variable a a changé pendant ces deux secondes. Pour que la fenêtre contextuelle dise "Hello world" après deux secondes, vous devez utiliser l'extrait de code suivant :

function callback(a){
    return function(){
        alert("Hello " + a);
    }
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";

Il attendra 2 secondes et affichera ensuite 'Hello world'.

194voto

Abhinav Points 1161

Il y a ce qui suit :

setTimeout(function, milliseconds);

à laquelle on peut passer le temps après lequel la fonction sera exécutée.

Voir : Fenêtre setTimeout() Méthode .

3 votes

Ce n'est pas une expression qui est exécutée, c'est une fonction. La réponse d'@Marius l'illustre bien.

123 votes

Ce n'est pas un retard, c'est une fourche. Le délai devrait fonctionner dans le même fil.

14 votes

Ceci exécutera immédiatement la fonction_référence. Pour "fonctionner" (de manière asynchrone), il faut l'énoncer comme suit : setTimeout(function () { MethodToCall() ; }, 1000) ;

39voto

Polsonby Points 11824

Juste pour développer un peu... Vous pouvez exécuter du code directement dans le setTimeout appel, mais comme @patrick dit, vous assignez normalement une fonction de rappel, comme ceci. Le temps est en millisecondes

setTimeout(func, 4000);
function func() {
    alert('Do stuff here');
}

27voto

Mario Werner Points 190

Si vous voulez vraiment avoir un système bloquant (synchrone) delay (pour quoi que ce soit), pourquoi ne pas faire quelque chose comme ceci :

<script type="text/javascript">
    function delay(ms) {
        var cur_d = new Date();
        var cur_ticks = cur_d.getTime();
        var ms_passed = 0;
        while(ms_passed < ms) {
            var d = new Date();  // Possible memory leak?
            var ticks = d.getTime();
            ms_passed = ticks - cur_ticks;
            // d = null;  // Prevent memory leak?
        }
    }

    alert("2 sec delay")
    delay(2000);
    alert("done ... 500 ms delay")
    delay(500);
    alert("done");
</script>

2 votes

La difficulté de cette solution est qu'elle utilise activement un processeur, ce qui entraîne une augmentation de la consommation d'énergie et une diminution des ressources disponibles pour d'autres threads/processus (par exemple, d'autres onglets, d'autres programmes). La mise en veille, en revanche, suspend temporairement l'utilisation des ressources du système par un thread.

1 votes

Il vaut mieux utiliser Date.now() au lieu de new Date() et ne pas penser aux fuites de mémoire

1 votes

Bien sûr, cette méthode est gourmande en ressources processeur, mais pour des tests rapides, elle fonctionne.

14voto

rcoup Points 1040

Vous pouvez également utiliser window.setInterval() pour exécuter un code de manière répétée à un intervalle régulier.

2 votes

SetInterval() ne devrait pas être utilisé mais plutôt setTimeout

9 votes

setTimeout() le fait une fois, setInterval() le fait de manière répétée. Si vous voulez que votre code soit exécuté toutes les 5 secondes, setInterval() est fait pour ce travail.

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