Espere 5 segundos antes de ejecutar la siguiente línea

Esta función a continuación no funciona como yo quiero; ser un novato JS no puedo entender por qué.

Necesito que espere 5 segundos antes de verificar si newState es -1 .

Actualmente, no espera, solo lo comprueba de inmediato.

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

setTimeout colocar su código en la función de callback que le proporciona a setTimeout :

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

Cualquier otro código se ejecutará de inmediato.

Realmente no debería estar haciendo esto, el uso correcto del tiempo de espera es la herramienta correcta para el problema del OP y cualquier otra ocasión en la que solo desee ejecutar algo después de un período de tiempo. Joseph Silber lo ha demostrado bien en su respuesta. Sin embargo, si en algún caso de no producción realmente desea colgar el hilo principal durante un período de tiempo, esto lo hará.

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

Con ejecución en la forma:

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

Llegué aquí porque estaba construyendo un caso de prueba simple para secuenciar una combinación de operaciones asíncronas alrededor de operaciones de locking de larga ejecución (es decir, costosa manipulación de DOM) y esta es mi operación de locking simulada. Se adapta bien a ese trabajo, así que pensé en publicarlo para cualquier otra persona que llegue aquí con un caso de uso similar. Aún así, está creando un objeto Date () en un ciclo while, lo que podría abrumar al GC si se ejecuta lo suficiente. Pero no puedo enfatizar lo suficiente, esto solo es adecuado para las pruebas, para construir cualquier funcionalidad real, debe consultar la respuesta de Joseph Silber.

No deberías simplemente intentar pausar 5 segundos en javascript. No funciona de esa manera. Puede progtwigr una función de código para que se ejecute en 5 segundos a partir de ahora, pero debe colocar el código que desea ejecutar más adelante en una función y el rest de su código después de esa función continuará ejecutándose inmediatamente.

Por ejemplo:

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

Pero, si tienes un código como este:

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

La instrucción console.log() se ejecutará inmediatamente. No esperará hasta que se stateChange() el tiempo de espera en la función stateChange() . No puede detener la ejecución de javascript por un período de tiempo predeterminado.

En su lugar, cualquier código que desee ejecutar retrasos debe estar dentro de la función de callback setTimeout() (o llamada desde esa función).

Si intentara “pausar” haciendo un bucle, entonces esencialmente “colgaría” el intérprete de JavaScript por un período de tiempo. Debido a que Javascript ejecuta su código en solo un hilo, cuando está en un bucle no se puede ejecutar nada más (no se puede llamar a ningún otro manejador de eventos). Por lo tanto, el bucle esperando que cambie alguna variable nunca funcionará porque no se puede ejecutar otro código para cambiar esa variable.

Use una función de retardo como esta:

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

Uso:

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

Los créditos van al CMS del usuario. Consulte ¿Cómo demorar el controlador .keyup () hasta que el usuario deje de escribir?

Aquí hay una solución que usa la nueva syntax async / await .

Asegúrese de verificar el soporte del navegador ya que esta es una nueva característica introducida con ECMAScript 6.

Función de ayudante:

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

Uso:

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

La ventaja de este enfoque es que hace que su código parezca un código sincrónico.

Prueba esto:

 //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); } } 

La mejor manera de crear una función como esta para esperar en milisegundos, esta función esperará milisegundos en el argumento:

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

Si está en una función asíncrona , simplemente puede hacerlo en una línea:

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

Observe que si el objective es NodeJS, será más eficiente usar esto (es una función predefinida de setTimeout promisificada):

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

Basado en la respuesta de Joseph Silber, lo haría así, un poco más genérico.

Tendría su función (creemos una basada en la pregunta):

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

Y podrías tener una función de espera:

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

Al final tendrías:

 wait(5000, videoStopped, newState); 

Esa es una solución, preferiría no usar argumentos en la función de espera (para tener solo foo(); lugar de foo(arg); ) pero eso es para el ejemplo.

Lo usé para ejecutar juegos de PC desde Edge o IE. Y cierra automáticamente IE Edge después de 7 segundos.

Firefox y Google Chrome no se pueden usar para iniciar juegos de esta manera.

   game    

usando angularjs:

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

Crear nueva función Js

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

Llame a la función cuando desee retrasar la ejecución. Use milisegundos en int para el valor de retardo.

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