2

Quisiera saber en qué casos es conveniente usar este método sin un tiempo de ejecución. Ando revisando un código ajeno y encuentro lo siguiente:

...
window.setTimeout(() => {
  type === 'hide' ?
  this.loader.hide() :
  this.loader.show();
});
...

He visto (por ejemplo en otros casos) que suele usarse con tiempo 0 (ejecución inmediata), pero eso tampoco lo entiendo.

En conclusión: No comprendo en palabras simples las siguientes preguntas "¿Cuál es el problema?" y "¿Qué soluciona usar setTimeout de esa forma?"

Cabe decir que estoy viendo este tema en Angular 5 con Typescript.

Ricky
  • 538
  • 4
  • 23

1 Answers1

4

JavaScript es single-thread o monohilo, es decir, toda la ejecución del código se realiza sobre un único hilo. Por eso es muy importante la gestión de la asincronía y los eventos, para no bloquear con tareas pesadas o de larga duración (como una petición Ajax); en caso contrario, se verán efectos como si la UI se quedara "congelada".

Con respecto al setTimeout, no es un problema ese parámetro no informado o con un tiempo cero. Cuando se especifica así:

setTimeout(f, 0);

lo que se está haciendo es planificar la ejecución de ese método lo más inmediatamente posible, pero no se asegura que se ejecute justo en ese momento aunque tenga un valor de cero.

Existe una cola de eventos, que es donde se irían añadiendo o encolando esas ejecuciones planificadas. Cuando el resto del código que está corriendo en el hilo principal ha terminado, lo que ocurre es que la máquina virtual de JS mirará en esa cola de eventos qué función debería ejecutar (si la hubiese). En este caso, como es cero, la función será ejecutada en ese momento.

Una posible utilidad de setTimeout con tiempo cero podría ser para posponer ciertas ejecuciones y que no se vea penalizado una implementación anterior.

Te dejo este vídeo, que a pesar de estar en inglés, se entienden muy bien los conceptos descritos y podrá ayudar mucho en la comprensión.

Si algo no queda claro, deja tu comentario.

Sema
  • 800
  • 6
  • 8
  • Primero que nada, muchas gracias por tu respuesta. Una pregunta: ¿Podríamos decir que definir un método setTimeout sin tiempo es igual a ponerle cero? Gracias, se entendió muy bien tu explicación, y veré el video. – Ricky Jun 21 '18 at 22:51
  • 1
    Sí, así es, si se omite el valor se utiliza un valor de cero. A modo de curiosidad, la signatura de setTimeout es así: `setTimeout(function, milliseconds, param1, param2, ...)`, por lo que puedes pasarle parámetros adicionales a la función, aunque no suele ser necesario. – Sema Jun 21 '18 at 22:53
  • Muchas gracias @Sema ! – Ricky Jun 21 '18 at 23:31