es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Resolución de nodos de promesas no esperadas en el script principal.

¿Por qué se imprime “timeout” por node antes de terminar cuando ejecuto el siguiente código?

const shouldNotPrint = async () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(‘timeout’)
resolve(‘foo’)
}, 300)
})
}

shouldNotPrint()
console.log(‘ended’)

Al ejecutar el código anterior con Node 16.13.0, se mostrará:

node src/index.js
ended
timeout

¿Hay algún tipo de espera de nivel superior await en Node esperando a que todas las promesas se resuelvan antes de finalizar el proceso?

Para aclarar: No quiero terminar Node antes del final de mi promesa. Solo quiero entender, a bajo nivel, el comportamiento de Node y del bucle de eventos en ese caso. Entiendo la lógica de un timeout + promesa y por qué se imprimiría después de “ended”. La pregunta es por qué se muestra en absoluto y por qué Node espera a que se muestre antes de terminar el proceso.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que “timeout” es impreso por Node antes de terminar es que Node.js tiene un bucle de eventos de nivel superior que se encarga de ejecutar el código y manejar eventos como I/O y temporizadores. Al ejecutar el código dado, Node.js encola la función de devolución de llamada de setTimeout() para ser ejecutada después de 300ms. Sin embargo, como el hilo principal de ejecución se desplaza inmediatamente después de la llamada a la función shouldNotPrint() hacia la sentencia console.log(“ended”), no espera a que se ejecute la devolución de llamada de setTimeout() antes de terminar.

    Node.js tiene un mecanismo para evitar que el hilo principal termine antes de que se hayan ejecutado todas las devoluciones de llamada. Este mecanismo es comúnmente conocido como el “bucle de eventos” y se encarga de programar tareas asíncronas y ejecutar devoluciones de llamada cuando las tareas se han completado. En este caso, el bucle de eventos espera a que se ejecute la devolución de llamada de setTimeout() antes de terminar el proceso. Por lo tanto, “timeout” se imprime antes de que termine el proceso.

    En resumen, Node.js no tiene un await de nivel superior, pero tiene un bucle de eventos que espera todas las devoluciones de llamada pendientes antes de terminar el proceso.

Comments are closed.