Hay un ejemplo en la explicación del bucle de eventos en el sitio web oficial de Node.js. Cuando se ejecuta setTimeout, la cola de devolución de llamada correspondiente a la fase del temporizador no está vacía, ¿verdad? Entonces, ¿por qué el bucle de eventos puede continuar hasta la fase de sondeo? El sitio web oficial dice que someAsyncOperation se ejecuta en 95 ms, ¿por qué la función de devolución de llamada de someAsyncOperation se ejecuta antes de la devolución de llamada de setTimeout?
const fs = require('fs'); function someAsyncOperation(callback) { // Assume this takes 95ms to complete fs.readFile('/path/to/file', callback); } const timeoutScheduled = Date.now(); setTimeout(() => { const delay = Date.now() - timeoutScheduled; console.log(`${delay}ms have passed since I was scheduled`); }, 100); // do someAsyncOperation which takes 95 ms to complete someAsyncOperation(() => { const startCallback = Date.now(); // do something that will take 10ms... while (Date.now() - startCallback < 10) { // do nothing } });Después de que se ejecuta someAsyncOperation , se tarda 95 ms en llamar a la devolución de llamada y, en este momento, setTimeout aún no está listo para ser llamado (tarda 100 ms).
Cuando se llama a la callback de llamada, ocupa la cola porque todavía se está ejecutando y tarda 10 ms.
Después de que la callback de llamada se ejecuta durante 5 ms más, setTimeout está listo pero la cola aún no está vacía, por lo que no se puede ejecutar.