Promises
Javascript es muy potente a la hora de trabajar con tareas asincrónicas, podemos programar funciones y código que hacen uso de `callbacks` para ejecutar código en el futuro cercano, cuando un evento sucede o cuando se termina la ejecución de un proceso (escribir en la base de datos, o escribir en el disco, hacer un request http, etc…).
Esto es genial, pero a veces nos sucede que tenemos callbacks anidadas, es decir, que dentro de un callback tenemos otro callback y así sucesivamente, y también tenemos problemas donde tenemos que esperar que dos o más eventos terminen para continuar la ejecución de nuestro código. Si bien podemos resolverlo sin problemas con callbacks, vamos a ver que nuestro código empieza a hacerse difícil de leer, muy difícil de controlar si hay errores (no sabemos qué función es la que realmente produjo el error), y si tenemos que buscar un bug dentro del código nos daremos cuenta que, sin querer, hemos terminado dentro del Callback Hell.