working not mdn loop ejemplos ejemplo javascript settimeout

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:

  1. JavaScript es de un solo subproceso. Las devoluciones de llamada asincrónicas se asignan a un mensaje colocado en una cola de mensajes .
  2. 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.
  3. 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: