Hay dos tipos (principalmente utilizados) de función de temporizador en javascript setTimeout
y setInterval
( otros )
Ambos métodos tienen la misma firma. Toman una función de devolución de llamada y demoran el tiempo como parámetro.
setTimeout
se ejecuta solo una vez después de la demora, mientras que setInterval
sigue llamando a la función de devolución de llamada después de cada milisegundo de demora.
ambos métodos devuelven un identificador entero que se puede usar para borrarlos antes de que expire el temporizador.
clearTimeout
y clearInterval
ambos métodos toman un identificador entero devuelto de las funciones anteriores setTimeout
ysetInterval
Ejemplo:
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
Si ejecuta el código anterior, verá que alerta before setTimeout
y after setTimeout
finalmente alerta I am setTimeout
después de 1 segundo (1000 ms)
Lo que puede observar en el ejemplo es que setTimeout(...)
es asíncrono, lo que significa que no espera a que transcurra el temporizador antes de pasar a la siguiente instrucción, es deciralert("after setTimeout");
Ejemplo:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
Si ejecuta el código anterior, verá que alerta before setInterval
y after setInterval
finalmente alerta I am setInterval
5 veces después de 1 segundo (1000 ms) porque setTimeout borra el temporizador después de 5 segundos o, de lo contrario, cada 1 segundo recibirá alerta I am setInterval
infinitamente.
¿Cómo hace eso el navegador internamente?
Te lo explicaré brevemente.
Para entender que tienes que saber sobre la cola de eventos en javascript. Hay una cola de eventos implementada en el navegador. Cada vez que se desencadena un evento en js, todos estos eventos (como clics, etc.) se agregan a esta cola. Cuando su navegador no tiene nada que ejecutar, toma un evento de la cola y los ejecuta uno por uno.
Ahora, cuando llame setTimeout
o setInterval
su devolución de llamada se registre en un temporizador en el navegador y se agregue a la cola de eventos después de que expire el tiempo dado y, finalmente, javascript toma el evento de la cola y lo ejecuta.
Esto sucede porque el motor de JavaScript tiene un solo subproceso y solo pueden ejecutar una cosa a la vez. Por lo tanto, no pueden ejecutar otros javascript y realizar un seguimiento de su temporizador. Es por eso que estos temporizadores están registrados con el navegador (el navegador no tiene un solo subproceso) y puede realizar un seguimiento del temporizador y agregar un evento en la cola después de que expire el temporizador.
Lo mismo ocurre setInterval
solo en este caso, el evento se agrega a la cola una y otra vez después del intervalo especificado hasta que se borra o se actualiza la página del navegador.
Nota
El parámetro de retraso que pasa a estas funciones es el tiempo mínimo de retraso para ejecutar la devolución de llamada. Esto se debe a que después de que expira el temporizador, el navegador agrega el evento a la cola para que el motor de JavaScript lo ejecute, pero la ejecución de la devolución de llamada depende de la posición de su evento en la cola y, dado que el motor tiene un solo subproceso, ejecutará todos los eventos en la cola uno por uno.
Por lo tanto, su devolución de llamada en algún momento puede tardar más que el tiempo de retraso especificado para ser llamado especialmente cuando su otro código bloquea el hilo y no le da tiempo para procesar lo que hay en la cola.
Y como mencioné, javascript es un solo hilo. Entonces, si bloquea el hilo por mucho tiempo.
Como este código
while(true) { //infinite loop
}
Su usuario puede recibir un mensaje que dice que la página no responde .
setTimeout(function(){/*YourCode*/},1000);