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.

¿Por qué mi código síncrono se está ejecutando asincrónicamente?

Estoy tratando de ejecutar una función sincrónica que debe esperar un cierto tiempo y luego devolver el control. Pero por alguna razón, se sigue ejecutando de forma asincrónica, o al menos es lo que parece.

Este es el código:

function pause(ms) {
  var dt = new Date();
  while (new Date() - dt <= ms) {
    /* No hacer nada */
  }
}

console.log("Iniciando cálculo..");
pause(3000);
console.log("¡Cálculo finalizado!");

Esto muestra inmediatamente lo siguiente en la consola:

Iniciando cálculo..
¡Cálculo finalizado!

No hay retraso alguno, como si la función pause se estuviera ejecutando de forma asíncrona.

He intentado tres versiones diferentes de la función pause, pero no hace ninguna diferencia.

Puedes ver esto en el sandbox donde he puesto el código.
(debes ir a preferencias – sandbox.config.json y desactivar “Protección de loop infinito” para que funcione)

  1. ¿Por qué no se está ejecutando el código de forma sincrónica, mostrando primero el mensaje “Iniciando cálculo..” y luego el segundo mensaje después de un retraso de 3 segundos?
  2. ¿Existe una mejor manera de simular la ejecución de una función sincrónica que es costosa en tiempo?
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    1. La función pause usa un bucle while para esperar el número de milisegundos especificado, pero está bloqueando el hilo principal y evitando que otro código se ejecute, incluyendo la instrucción console.log que debería mostrar “se inicia el cálculo…” antes del retraso. Por eso parece que la función se ejecuta de forma asíncrona.
    2. Una forma mejor de simular la ejecución de una función sincrónica costosa en tiempo es usar la función setTimeout. setTimeout programa una función para que se ejecute después de un retraso especificado, sin bloquear el hilo principal. La función pause se puede refactorizar de la siguiente manera:

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

    Esta función devuelve una promesa que se resuelve después del retraso especificado, permitiendo que otro código se ejecute mientras se espera. Para usar esta función, podemos encadenar un método .then al final, así:

    console.log("se inicia el cálculo...");
    pause(3000).then(() => {
      console.log("¡cálculo finalizado!");
    });
    

    Este código mostrará “se inicia el cálculo…” inmediatamente, y luego esperará tres segundos antes de mostrar “¡cálculo finalizado!”.

Comments are closed.