Mira que había visto varias veces que el uso de async/await era sencillo, pero aún me estaba resistiendo y optando por el uso de promesas. Viendo que está soportado en la mayoría de navegadores de escritorio actuales y en las versiones más recientes de node, he decidido hacer unas pruebas para enamorarme de esta feature al instante.

Si con el uso de promesas ya podemos mitigar el architemido callback hell, con async/await lo eliminamos de un plumazo.

¿Y qué son async y await?

Una función asíncrona se declara con async, y no es más que una función que devuelve una promesa. Lo gracioso del tema es que no tenemos que declarar el objeto Promise en ningún momento.

Estas funciones asíncronas, a su vez, pueden llamar a otras funciones que devuelven promesas. En lugar de .then, Promise.all y demás, podemos utilizar await. Esta instrucción detiene la ejecución de una función hasta que la promesa se ha resuelto, resolviendo así todo en una única línea.

Es importante recordar que la instrucción await sólo puede utilizarse dentro de una función declarada como async.

En el siguiente ejemplo, podemos ver cómo creamos una función asíncrona para realizar dos llamadas a la API de Star Wars. Esta función devuelve el resultado de ambas llamadas, y se pinta por pantalla en otra función asíncrona.

Muy bonito. Pero esto es un camino feliz. Las promesas tienen un bloque específico para capturar errores. ¿Y cómo hago esto yo ahora? Fácil: con un bloque try/catch de toda la vida:

Recordemos que la función fetch devuelve una promesa, y json otra. De ahí la doble llamada a await.

Este mismo código podemos verlo funcionando en este Plunker.

Como he comentado, una función asíncrona devuelve una promesa. Por tanto, también podemos utilizar la sintaxis de la API de promesas con una función asíncrona. Por ejemplo:

¿Y cómo sería esto con promesas? Pues más feo, sinceramente. Reconozco que he hecho trampas para afearlo un poco más, no utilizando arrow functions. En cualquier caso, el código es más difícil de entender que en el caso donde utilizamos async/await.

Agradecimientos

Quisiera dar las gracias a Alex Jover. Es interesante ver cómo una conversación por whatsapp y un tweet te animan a ver cosillas y escribir un artículo para tu blog. Y creo que a él le ha sucedido algo similar 🙂

Anuncios