Dormir en Node.js

Isaac Tony 12 octubre 2023
  1. Utilice el método setTimeout() para programar la ejecución de códigos en Node.js
  2. Utilice el método setInterval() para programar la ejecución de códigos en Node.js
  3. Utilice la palabra clave await() para pausar la ejecución de códigos en Node.js
Dormir en Node.js

En Node.js (o la programación en general), hay escenarios en los que necesitamos que se ejecute un determinado código o script periódicamente. Node.js nos proporciona dos funciones integradas que podemos usar para programar la ejecución de funciones en Node.js y JavaScript.

Estos métodos se encuentran a continuación.

  1. setTimeout()
  2. setInterval()

Utilice el método setTimeout() para programar la ejecución de códigos en Node.js

El método setTimeout() es un método asíncrono que nos permite ejecutar una función una vez después de determinados intervalos de tiempo. La función setTimeout() acepta muchos parámetros, dos de los cuales son obligatorios mientras que el resto son opcionales.

  1. La función que se ejecutará después del intervalo de tiempo establecido
  2. El número en milisegundos que esperará el temporizador antes de ejecutar la función especificada
  3. Algún código que se ejecutará después del tiempo establecido supera cualquier otro argumento especificado en la función que se ejecutará.

Esta función devuelve un número entero conocido como ID de tiempo de espera que puede hacer referencia al objeto creado por la función setTimeout().

Aquí hay un ejemplo simple del uso de la función setTimeout() para ejecutar funciones en un intervalo de tiempo diferente especificado en milisegundos.

setTimeout(() => {console.log('This is the first function')}, 2000);
setTimeout(() => {console.log('This is the second function')}, 4000);
setTimeout(() => {console.log('This is the final function')}, 5000);

Salida de muestra:

This is the first function
This is the second function
This is the final function

En el ejemplo anterior, hay un tiempo de espera de 2 segundos antes de que se ejecuten la primera y la segunda función y un tiempo de espera de 1 segundo antes de que se ejecute la última función.

Ahora, dado que setTimeout() es una función asíncrona, podríamos ejecutar la función final. Al mismo tiempo, la segunda función espera en segundo plano y hace que la primera función se ejecute en último lugar con un tiempo de espera de 2 segundos entre cada función.

setTimeout(() => {console.log('This is the first function')}, 6000);
setTimeout(() => {console.log('This is the second function')}, 4000);
setTimeout(() => {console.log('This is the final function')}, 2000);

Salida de muestra:

This is the final function
This is the second function
This is the first function

El setTimeout() es realmente útil cuando se usa junto con las funciones de devolución de llamada para configurar las funciones de devolución de llamada para que se ejecuten después de un tiempo. Aquí hay una función de devolución de llamada simple configurada para ejecutarse después de 4 segundos.

const displayFunction =
    () => {
      console.log('Code to be executed by the display function!');
      // some more code
    }

// function may contain more parameters
setTimeout(displayFunction, 4000);

Salida de muestra:

Code to be executed by the display function!

A continuación se muestra un enfoque más preciso y preferible de reescribir el código usando una función de flecha.

setTimeout(() => {console.log('Code to be executed by the function!')}, 4000)

Salida de muestra:

Code to be executed by the function!

Utilice el método setInterval() para programar la ejecución de códigos en Node.js

El módulo de temporizadores también nos proporciona el método setInterval(), cuya funcionalidad es similar al método setTimeout(). Sin embargo, a diferencia del método setTimeout(), el método setInterval() nos permite ejecutar un script repetidamente en intervalos determinados hasta que se detiene explícitamente.

El método setInterval() acepta dos parámetros obligatorios: la función a ejecutar y el intervalo de tiempo de ejecución. También podemos agregar parámetros opcionales adicionales a la función.

El método devuelve un objeto conocido como ID de temporizador que se puede usar para cancelar el temporizador. Aquí hay un ejemplo simple de implementación del método setInterval().

setInterval(() => {
  console.log('Function repeatedly executed after every 2 seconds!');
}, 2000)

Salida de muestra:

Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
^C

Esta función se ejecutará repetidamente a menos que se interrumpa usando la interrupción del teclado presionando CTRL+C. Una forma más convencional de detener el método setInterval() después de ejecutar un número determinado de veces es utilizando la función clearInterval().

Podemos hacer esto pasando el ID devuelto por el método setInterval() como parámetro a clearInterval() como se muestra a continuación.

const id = setInterval(() => {
  console.log('Function repeatedly executed after every 2 seconds!');
}, 2000)

clearInterval(id);

También podemos usar el método setTimeout() junto con el método clearInterval() para detener el método setInterval() después de un número determinado de segundos.

Aquí hay un ejemplo simple de lo mismo.

const id = setInterval(() => {
  console.log('Function repeatedly executed after every 2 seconds!');
}, 2000)

setTimeout(
    () => {
      clearInterval(id),
      console.log('Function stopped after 10 seconds!')
    },
    10000)

Salida de muestra:

Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function repeatedly executed after every 2 seconds!
Function stopped after 10 seconds!

Utilice la palabra clave await() para pausar la ejecución de códigos en Node.js

A diferencia de otros lenguajes de programación como C que brindan una función sleep, que nos permite dormir un hilo determinado mientras esperamos que se ejecute otro, JavaScript no tiene esta función.

Sin embargo, al usar una función asincrónica basada en promesas, podemos usar la palabra clave await() para pausar la ejecución de un fragmento de código hasta que esa promesa se cumpla primero.

Llamaremos a esta función sleep(); sin embargo, eso no le impide nombrarlo con cualquier otro nombre que pueda encontrar apropiado.

En la función async, hemos utilizado la palabra clave await() para suspender la segunda función console.log() hasta que se resuelva la promesa; esto toma un promedio de 4 segundos. El valor devuelto por la promesa se considera como un valor de retorno de la expresión await().

async function my_asyncFunction() {
  console.log('Some Code we want to be executed');
  await sleep(4000);
  console.log('Some other code we want to be executed after some seconds');
}

function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

my_asyncFunction();

Salida de muestra:

Some Code we want to be executed
Some other code we want to be executed after some seconds

No podemos usar la expresión await() fuera de las funciones async en el código Javascript regular hasta el momento. Cualquier intento de usar esa sintaxis devuelve un error de sintaxis.

async function my_asyncFunction() {
  console.log('Some Code we want to be executed');

  console.log('Some other code we want to be executed after some seconds');
}

await sleep(4000);
function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

my_asyncFunction();

Salida de muestra:

E:\Tonyloi>await.js:7
await sleep(4000);
^^^^^

SyntaxError: await is only valid in async functions and the top level bodies of modules
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1031:15)
    at Module._compile (node:internal/modules/cjs/loader:1065:27)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:17:47

Sin embargo, podemos usar la expresión await fuera de la función async en la sintaxis del módulo de JavaScript.

Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn