Attendez 5 secondes avant d’exécuter la ligne suivante

Cette fonction ci-dessous ne fonctionne pas comme je le souhaite; être un novice de JS je ne peux pas comprendre pourquoi.

J’en ai besoin pour attendre 5 secondes avant de vérifier si le newState est -1 .

Actuellement, il n’attend pas, il vérifie tout de suite.

 function stateChange(newState) { setTimeout('', 5000); if(newState == -1) { alert('VIDEO HAS STOPPED'); } } 

Vous devez mettre votre code dans la fonction de rappel que vous fournissez à setTimeout :

 function stateChange(newState) { setTimeout(function () { if (newState == -1) { alert('VIDEO HAS STOPPED'); } }, 5000); } 

Tout autre code sera exécuté immédiatement.

Vous ne devriez vraiment pas faire cela, l’utilisation correcte de timeout est le bon outil pour le problème du PO et toute autre occasion où vous voulez simplement exécuter quelque chose après un certain temps. Joseph Silber l’a bien démontré dans sa réponse. Toutefois, si dans certains cas de non-production, vous voulez vraiment accrocher le thread principal pendant un certain temps, cela le fera.

 function wait(ms){ var start = new Date().getTime(); var end = start; while(end < start + ms) { end = new Date().getTime(); } } 

Avec exécution sous la forme:

 console.log('before'); wait(7000); //7 seconds in milliseconds console.log('after'); 

Je suis arrivé ici parce que je construisais un cas de test simple pour séquencer un mélange d'opérations asynchrones autour d'opérations de blocage de longue durée (c'est-à-dire une manipulation DOM coûteuse) et ceci est mon opération de blocage simulée. Cela convient bien à ce travail, alors j'ai pensé le poster pour quiconque arrive ici avec un cas d'utilisation similaire. Malgré cela, il crée un object Date () dans une boucle while, ce qui risque de surcharger le GC s'il est suffisamment long. Mais je ne saurais trop insister sur le fait que cela ne convient que pour les tests. Pour créer une fonctionnalité réelle, vous devez vous reporter à la réponse de Joseph Silber.

Vous ne devriez pas simplement essayer de faire une pause de 5 secondes en javascript. Ça ne marche pas comme ça. Vous pouvez programmer une fonction de code pour qu’elle s’exécute dans 5 secondes, mais vous devez placer le code que vous souhaitez exécuter plus tard dans une fonction et le rest de votre code après cette fonction continuera à s’exécuter immédiatement.

Par exemple:

 function stateChange(newState) { setTimeout(function(){ if(newState == -1){alert('VIDEO HAS STOPPED');} }, 5000); } 

Mais si vous avez du code comme celui-ci:

 stateChange(-1); console.log("Hello"); 

L’ console.log() s’exécutera immédiatement. Il n’attendra pas après le délai d’attente déclenché dans la fonction stateChange() . Vous ne pouvez pas simplement interrompre l’exécution de JavaScript pendant une durée prédéterminée.

Au lieu de cela, tout code que vous souhaitez exécuter doit être à l’intérieur de la fonction de rappel setTimeout() (ou appelée depuis cette fonction).

Si vous avez essayé de “faire une pause” en boucle, vous “bloquerez” essentiellement l’interpréteur Javascript pendant un certain temps. Parce que Javascript n’exécute votre code que dans un seul thread, lorsque vous faites une boucle, rien d’autre ne peut s’exécuter (aucun autre gestionnaire d’événement ne peut être appelé). Ainsi, le bouclage en attente d’une modification de variable ne fonctionnera jamais car aucun autre code ne peut être exécuté pour modifier cette variable.

Utilisez une fonction de délai comme ceci:

 var delay = ( function() { var timer = 0; return function(callback, ms) { clearTimeout (timer); timer = setTimeout(callback, ms); }; })(); 

Usage:

 delay(function(){ // do stuff }, 5000 ); // end delay 

Les crédits vont à l’utilisateur CMS, voir Comment retarder le gestionnaire .keyup () jusqu’à ce que l’utilisateur arrête de taper?

Voici une solution utilisant la nouvelle syntaxe async / waiting .

Assurez-vous de vérifier le support du navigateur car il s’agit d’une nouvelle fonctionnalité introduite avec ECMAScript 6.

Fonction d’assistance:

 const delay = ms => { return new Promise(resolve => { setTimeout(resolve, ms); }); }; 

Usage:

 const yourFunction = async () => { await delay(5000); console.log("Waited 5s"); await delay(5000); console.log("Waited an additional 5s"); }; 

L’avantage de cette approche est que votre code ressemble à du code synchrone.

Essaye ça:

 //the code will execute in 1 3 5 7 9 seconds later function exec() { for(var i=0;i<5;i++) { setTimeout(function() { console.log(new Date()); //It's you code },(i+i+1)*1000); } } 

Le meilleur moyen de créer une fonction comme celle-ci pour attendre en millisecondes, cette fonction attendra des millisecondes dans l’argument:

 function waitSeconds(iMilliSeconds) { var counter= 0 , start = new Date().getTime() , end = 0; while (counter < iMilliSeconds) { end = new Date().getTime(); counter = end - start; } } 

Si vous êtes dans une fonction asynchrone, vous pouvez simplement le faire en une seule ligne:

 console.log(1); await new Promise(resolve => setTimeout(resolve, 3000)); // 3 sec console.log(2); 

Notez que si la cible est NodeJS, il sera plus efficace d’utiliser cette fonction (c’est une fonction setTimeout prédéfinie prédéfinie):

 await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000) // 3 sec 

Sur la base de la réponse de Joseph Silber, je le ferais comme ça, un peu plus générique.

Vous auriez votre fonction (créons-en une basée sur la question):

 function videoStopped(newState){ if (newState == -1) { alert('VIDEO HAS STOPPED'); } } 

Et vous pourriez avoir une fonction d’attente:

 function wait(milliseconds, foo, arg){ setTimeout(function () { foo(arg); // will be executed after the specified time }, milliseconds); } 

A la fin, vous auriez:

 wait(5000, videoStopped, newState); 

C’est une solution, je préfère ne pas utiliser d’arguments dans la fonction wait (avoir seulement foo(); au lieu de foo(arg); ) mais c’est pour l’exemple.

Je l’ai utilisé pour lancer des jeux sur PC depuis Edge ou IE. Et il ferme automatiquement IE Edge après 7 secondes.

Firefox et Google Chrome ne peuvent pas être utilisés pour démarrer des jeux de cette façon.

   game    

en utilisant angularjs:

 $timeout(function(){ if(yourvariable===-1){ doSomeThingAfter5Seconds(); } },5000) 

Créer une nouvelle fonction Js

 function sleep(delay) { var start = new Date().getTime(); while (new Date().getTime() < start + delay); } 

Appelez la fonction lorsque vous souhaitez retarder l'exécution. Utilisez des millisecondes dans int pour la valeur de délai.

 ####Some code sleep(1000); ####Next line