Temporizadores en Node JS

temporizadores

Temporizadores en Node JS (setTimeout, setImmediate, setInterval, process.nextTick)

¡Hola! Hoy exploraremos los temporizadores. Usando Timers en NodeJS puede programar la ejecución de funciones.


¿Cómo se programan los temporizadores?

Como es el caso en NodeJS, todo el código síncrono se ejecuta antes que cualquier código asincrónico. Los temporizadores son parte del código asincrónico, ya que la mayoría de las veces pasa la devolución de llamada para que se ejecute con un tiempo diferido. La devolución de llamada del temporizador se registrará para su ejecución una vez transcurrido el tiempo diferente. Los temporizadores tienen una fase / cola separada en el bucle de eventos, donde se ejecuta la devolución de llamada del temporizador registrada.

Ahora hay dos partes. Ejecución del temporizador y ejecución de devolución de llamada,

  • Los temporizadores se ejecutan fuera del bucle de eventos dentro de la API web.
  • Las devoluciones de llamada se ejecutan en la fase / cola de temporizadores.

Dado que las devoluciones de llamada de los temporizadores se ejecutan en la fase / cola de los temporizadores, es posible que deba esperar hasta que se produzca esta fase para la ejecución. Esto podría ser un cuello de botella en algunos casos. Entonces, NodeJS proporciona otros métodos para superar esto al proporcionar métodos para ejecutar en varias fases del bucle de eventos.

Exploremos los diferentes métodos de temporizador y su caso de uso.

Temporizadores compatibles

  • setTimeout
  • setImmediate
  • setInterval
  • process.nextTick

SetTimeout

Esto toma 2-N argumentos y devuelve el objeto Timeout.

setTimeout(callback, [delay], [...args])
  1. Devolución de llamada para ejecutar (debería ser una función)
  2. Retraso en milisegundos. (Cualquier valor que no sea un número se resolverá al valor predeterminado de 1)
  3. Argumentos separados por comas. (Estos se pasarán como argumentos de entrada a la devolución de llamada)

La devolución de llamada se ejecuta en la fase / cola de temporizadores del bucle de eventos. Entonces, cuando transcurre el tiempo de demora en la API web, la devolución de llamada se registra en la fase / cola de Timers. La devolución de llamada se ejecutará en el orden de registro en la fase / cola de temporizadores.

Debido a esto, no hay garantía de que la devolución de llamada se ejecute exactamente después del tiempo de espera, puede tomar más tiempo que el retraso basado en la carga del bucle de eventos. No hay forma de superar el comportamiento como lo es el diseño de NodeJS.

Puede borrar la ejecución de la función programada usando clearTimeout

clearTimeout(Timeout)
  1. Objeto / id de tiempo de espera obtenido de setTimeout

Process.nextTick

Esto requiere una devolución de llamada para ejecutarse.

process.nextTick(callback)

Devolución de llamada para ejecutar (debería ser una función)

Cada finalización de un ciclo / ciclo de ciclo de eventos se denomina Tick. Entonces, la devolución de llamada se ejecuta después de la finalización del ciclo de eventos actual y antes del inicio del siguiente ciclo de eventos. Sorprendentemente, process.nextTick no es parte del ciclo de eventos. Todas las devoluciones de llamada registradas en nextTick se ejecutan en el lado C ++.

La ventaja de esto es que se puede llamar a process.nextTick de forma recursiva y retrasar la siguiente ejecución del ciclo de eventos. Otra ventaja es que, dado que es parte de C ++, no tendrá el error JS Stack Limit, que ayuda en la llamada recursiva teóricamente infinita a process.nextTick.

Una vez que se registra una devolución de llamada en nextTick, no hay forma de detener su ejecución. Por lo tanto, se sugiere usar nextTick solo en los casos anteriores. En la última versión de NodeJS podemos usar setImmediate para tener prioridad de programación sobre setTimeout.


SetImmediate

Esto toma argumentos 1-N como entrada y devuelve el objeto Timeout.

setImmediate(callback, [args])

Devolución de llamada para ejecutar. (Debería ser una función)

Argumentos separados por comas. (Estos se pasarán como argumentos de entrada a la devolución de llamada)

Las devoluciones de llamada se ejecutan como primera fase en el bucle de eventos. es decir, se ejecuta antes de la fase setTimeout y después de process.nextTick. El caso de uso es cuando desea actualizar algo antes de que se ejecute cualquier otra fase.

Puede borrar la función programada utilizando clearImmediate.

clearImmediate(timeout)
  1. Objeto de tiempo de espera / id obtenido de setImmediate

SetInterval

Esto toma dos argumentos N y devuelve el objeto Timeout

setInterval(callback, [interval], [args])
  1. Devolución de llamada para ejecutar (debería ser una función)
  2. Retraso en milisegundos. (Cualquier valor que no sea un número se resolverá al valor predeterminado de 1)
  3. Argumentos separados por comas. (Estos se pasarán como argumentos de entrada a la devolución de llamada)

Una vez que ocurre el intervalo, la devolución de llamada se registra en la fase / cola de temporizadores. La devolución de llamada se ejecuta cuando esta fase ocurre en el bucle de eventos. Nuevamente, esto no garantiza la ejecución inmediatamente después de que ocurra el intervalo. Esto se usa cuando desea realizar alguna tarea por un número infinito de veces.

Puede borrar la ejecución de la función programada usando clearInterval

clearInterval(Timeout)
  1. Objeto / id de tiempo de espera obtenido de setInterval

Así que, para terminar, se muestran los diferentes tipos de temporizadores compatibles para casos de uso particulares como se muestra a continuación.

  • setTimeout -> ejecutar con después de algún tiempo.
  • setImmediate -> ejecutar antes que nada.
  • setInterval -> ejecutar infinitamente con algo de retraso.
  • process.nextTick -> ejecutar entre el ciclo de eventos.

Recent Post