JavaScript es de un solo hilo
JavaScript ejecuta una sola cosa a la vez. Entonces, ¿cómo descarga un archivo o espera una respuesta del servidor sin "congelarse"? Gracias al event loop.
Las operaciones que tardan (peticiones de red, temporizadores...) se delegan al entorno (el navegador o Node) y JavaScript sigue ejecutando el resto del código. Cuando la tarea termina, su función de respuesta se mete en una cola, y el event loop la ejecuta en cuanto el hilo principal está libre.
console.log("1");
setTimeout(() => console.log("2"), 0); // se aplaza
console.log("3");
// Imprime: 1, 3, 2
Aunque el retraso sea 0, el callback de setTimeout espera a que termine el
código actual. Esa es la clave de la asincronía.
Callbacks
Históricamente, las tareas asíncronas se manejaban con callbacks: funciones que pasas para que se llamen "cuando termine".
descargar("datos.json", function (resultado) {
console.log("Listo:", resultado);
});
El problema: anidar muchos callbacks produce el temido callback hell, código en forma de pirámide difícil de leer. Las promesas nacieron para resolverlo.
Ejemplos
El orden no es el que parece
console.log("Inicio");
setTimeout(() => console.log("Tarea aplazada"), 0);
console.log("Fin");