¿Qué es async/await?

Los problemas de utilizar promesas con thennables


En se introducen las palabras clave async y await, que no son más que una forma alternativa de gestionar las promesas en Javascript. Se trata de un mecanismo de azúcar sintáctico para gestionar promesas, y escribir código de una forma más simple, directa y similar a lo que solemos estar acostumbrados en la programación síncrona.

El problema del .then()

Repasemos un fragmento de código donde manejamos promesas mediante .then(), como vimos en capítulos anteriores. Cuando no estás acostumbrado a trabajar con promesas, este código se lee de forma diferente a como se escribe, no es secuencial y puede ser difícil de entender:

fetch("/data.json")
  .then(response => response.json())
  .then(data => console.log("Código asíncrono", data));

console.log("Código síncrono.");

Utilizando el mecanismo de async/await también seguiremos trabajando con promesas, sin embargo, hay ciertos cambios importantes que lo simplifican bastante:

  • 1️⃣ No encadenamos mediante .then(), sino que es más natural.
  • 2️⃣ La palabra await parece «pausar» las funciones, algo mucho más fácil de entender.
  • 3️⃣ Al no indentar .then(), no hay sensación de tener múltiples niveles.
  • 4️⃣ Los desarrolladores que aún no comprenden la asincronía, intentarán «pasar» los datos del interior del .then() a su exterior, como harían en un contexto síncrono.

Por estas y otras razones es posible que async/await te interese más para escribir código.

Las funciones asíncronas

Vamos a detenernos un momento a pensar esto desde la base. Más adelante, vamos a empezar a utilizar funciones asíncronas. Vamos a definir dos funciones básicas exactamente iguales, que devuelvan lo mismo, pero una síncrona y otra asíncrona.

Como puedes ver, la única diferencia entre ambas versiones es que le hemos añadido la palabra clave async antes de definir la función:

function sincrona() { return 42; }
async function asincrona() { return 42; }

sincrona();   // 42
asincrona();  // Promise <fulfilled>: 42
const sincrona = () => 42;
const asincrona = async () => 42;

sincrona();   // 42
asincrona();  // Promise <fulfilled>: 42

En el caso de la función sincrona() devuelve directamente el valor 42. En el caso de la función asincrona() devuelve una promesa cumplida inmediatamente, con el valor 42.

Ten esto en cuenta para el siguiente tema, donde vamos a ver como funciona async/await.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev