JavaScript: Sleep y setTimeout

A veces, como programador, te encuentras en una situación en la que necesitas interrumpir la ejecución de tu programa durante un breve tiempo. Para ello, existen varias posibilidades en los distintos lenguajes de programación. En JavaScript, desde ES6, existe la opción de utilizar Promises para este fin.

  • Implementar una función de suspensión
  • Ejecutar una función con retardo

Implementar una función de suspensión

Para suspender unos segundos en JavaScript, basta con definirse una pequeña función auxiliar. La función Sleep devuelve un objeto Promise cuyo estado se establece como resuelto después del tiempo deseado en milisegundos.

función Sleep(milisegundos) {
devolver new Promise(resolver => setTimeout(resolver, milisegundos));

Si ahora quieres utilizar esta funcionalidad, tienes que marcar tu función con la palabra clave async-. Sin async no está permitido utilizar el comando await. Un ejemplo de uso se muestra en la siguiente función:

función asíncrona test() {
console.log("Antes de la función sleep");
await Sleep(3000); // Pausa la función durante 3 segundos
console.log("Después de la función sleep");
}

La función llama a la función Sleep. El uso de await detiene la ejecución de la función durante el tiempo especificado. Sin await la función seguiría ejecutándose porque no hay que esperar a la resolución del objeto Promise devuelto por Sleep.

Ejecutar una función con retardo

Para ejecutar una función tras un tiempo de espera especificado, existe la función setTimeout. Con setTimeout se pasa una función denominada callback para que se ejecute. Esta función se ejecuta después del tiempo especificado. Así que define una función a la que llamar:

función callback() {
console.log("Se llama a la función callback");
}

Ahora puedes usar setTimeout para llamar a la función que acabas de crear con el retraso especificado. Tenga en cuenta, sin embargo, que el siguiente código se ejecutará sin esperar:

setTimeout(callback, 3000); //Llamar a la función callback después de 3 segundos
console.log("Test"); //Se ejecutará inmediatamente, sin esperar

Alternativamente, también es posible pasar una expresión de función como argumento a setTimeout. Así que también puedes llamar a setTimeout de la siguiente manera:

setTimeout(function() {
console.log("Se llama a la función Callback");
}, 3000);

La ventaja aquí es que no es necesario definir una nueva función y puedes ver inmediatamente qué bloque de código se ejecutará después del retardo.