javascript - not - timer jquery ejemplos
¿Qué hace setTimeout cuando se establece en 0 milisegundos? (1)
En JavaScript,
setTimeout(callback, delay)
significa "
callback
después de milisegundos de
delay
".
Pero, ¿y si el
delay
es
0
?
¿Debería
callback
la
callback
inmediato?
Estoy confundido por lo que veo cuando ejecuto el siguiente código:
setTimeout(function() {
console.log(''AAA'');
}, 0); // Call this in 0 milliseconds
for (i = 0; i < 1000; i++) {
console.log(''BBB'');
}
for (i = 0; i < 1000; i++) {
console.log(''CCC'');
}
for (i = 0; i < 1000; i++) {
console.log(''DDD'');
}
for (i = 0; i < 1000; i++) {
console.log(''EEE'');
}
Esto registra lo siguiente en la consola:
Esperaba ver
AAA
registrado mucho antes que eso.
Había tiempo para ejecutar otras 4000 llamadas a
console.log
antes de una función que debería haberse llamado de inmediato.
¿Alguien puede explicar qué hace
setTimeout
cuando el retraso se establece en 0 milisegundos?
Algunos datos útiles pueden ayudar a aclarar lo que está sucediendo:
- JavaScript es de un solo subproceso. Las devoluciones de llamada asincrónicas se asignan a un mensaje colocado en una cola de mensajes .
- Cuando no se está ejecutando ningún código, el bucle de eventos sondea la cola de mensajes y solicita que se procese (ejecute) el siguiente mensaje en línea.
-
setTimeout
agrega un mensaje (con la devolución de llamada proporcionada) al final de esta cola una vez transcurrido el retraso especificado.
(Nota: esto significa que la demora en una llamada
setTimeout
no es algo seguro; es la
demora mínima
antes de que se ejecute la devolución de llamada. El tiempo real que se
demora
depende del tiempo que tome procesar los mensajes en la cola).
Entonces, ¿qué sucede si el retraso se establece en
0
?
Se agrega un nuevo mensaje a la cola de inmediato, y se procesará cuando finalice el código que se está ejecutando actualmente y se hayan procesado los mensajes agregados anteriormente.
¿Qué está pasando en tu código?
Cuando
setTimeout
...
setTimeout(function() {
console.log(''AAA'');
}, 0);
... se agrega un mensaje a la cola con la devolución de llamada especificada. El resto de tu código ...
for (i = 0; i < 1000; i++) {
console.log(''BBB'');
}
// etc.
... continúa ejecutándose sincrónicamente.
Una vez que ha finalizado por completo, el bucle de eventos sondea la cola de mensajes para el siguiente mensaje y encuentra el que tiene la
setTimeout
llamada
setTimeout
, que luego se procesa (se ejecuta la devolución de llamada).
La devolución de llamada solo se ejecuta una vez que el código que se está ejecutando actualmente ha finalizado, sin importar cuánto tiempo tome.
Otras lecturas
Para obtener más detalles sobre el bucle de eventos, consulte: