unos tiempo segundos funcion esperar espera ejecutar despues attribute javascript javascript-events

javascript - tiempo - Espera 5 segundos antes de ejecutar la siguiente línea.



html title attribute (12)

Esta función a continuación no funciona como lo deseo; siendo un novato en JS no puedo entender por qué.

Necesito esperar 5 segundos antes de verificar si el estado newState es -1 .

Actualmente, no espera, solo comprueba de inmediato.

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


Aquí hay una solución utilizando la nueva sintaxis 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 ayuda:

const delay = ms => new Promise(res => setTimeout(res, 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 se vea como un código síncrono.


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

Tendrías tu 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.


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 quiera retrasar la ejecución. Use milisegundos en int para el valor de retardo.

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


La mejor forma de crear una función como esta para esperar en milisegundos, esta función esperará los milisegundos proporcionados 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; } }


Lo usé para ejecutar juegos de PC desde Edge o IE. Y se auto cierra IE Edge después de 7 segundos.

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

<html<body> <a href="E:/game/game.exe" name="game" onmouseout="waitclose(7000);"> game <img src="game.jpg" width="100%" height="97%" ></a> <script> function waitclose(ms){ var start = new Date().getTime();var end=start; while(end < start + ms) {end = new Date().getTime();} window.open('''', ''_self'', ''''); window.close(); } </script> </body></html>


No debes tratar de pausar 5 segundos en javascript. No funciona de esa manera. Puede programar una función de código para que se ejecute dentro de 5 segundos, pero debe colocar el código que desea ejecutar más adelante en una función y el resto de su código después de esa función continuará ejecutándose de inmediato.

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 sentencia console.log() se ejecutará inmediatamente. No esperará hasta después de que el tiempo de espera se dispare en la función stateChange() . No puedes simplemente pausar la ejecución de javascript por un tiempo predeterminado.

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

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


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


Realmente no deberías estar haciendo esto, el uso correcto del tiempo de espera es la herramienta adecuada para el problema del OP y en cualquier otra ocasión en la que solo quieras 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 no de 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 el formulario:

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

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


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

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

Tenga en cuenta que si el objetivo es NodeJS será más eficiente usar esto (es una función setTimeout predefinida y promisificada):

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


Utilice 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 usuario CMS, consulte ¿Cómo retrasar el controlador .keyup () hasta que el usuario deje de escribir?


usando angularjs:

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


setTimeout colocar su código en la función de devolución de llamada que proporciona a setTimeout :

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

Cualquier otro código se ejecutará inmediatamente.