⚡JavaScript

Cómo funcionan las Promesas en JavaScript: Guía paso a paso

Felipe••4 min de lectura
Aprende a dominar las promesas en JavaScript con ejemplos claros, buenas prácticas y comparaciones con async/await.

Las Promesas son una de las herramientas más poderosas del JavaScript moderno. Gracias a ellas, podemos manejar operaciones asíncronas (como llamadas a APIs, acceso a archivos o temporizadores) de una forma mucho más legible y predecible que con los antiguos callbacks.

🌱 ¿Qué es una Promesa?

Una Promesa es un objeto que representa el resultado eventual de una operación asíncrona: puede cumplirse ( resolve) con éxito o rechazarse (reject) si ocurre un error.

Piensa en ella como un contrato:

“Te prometo que te daré una respuesta… no ahora, pero en algún momento.”

Estados de una Promesa

EstadoDescripciónEmoji
pendingLa promesa está en proceso, esperando que termine la operación.⏳
fulfilledLa promesa se resolvió correctamente.✅
rejectedAlgo salió mal.❌

⚙️ Crear una Promesa

Podemos crear una promesa usando el constructor Promise():

const miPromesa = new Promise((resolve, reject) => {
  const exito = true;

  if (exito) {
    resolve("Operación completada con éxito 🎉");
  } else {
    reject("Algo salió mal 💥");
  }
});

Consumir una Promesa

Para obtener el valor de la promesa, usamos los métodos .then() y .catch():

miPromesa
  .then(resultado => console.log(resultado)) // 🎉 "Operación completada con éxito"
  .catch(error => console.error(error));     // 💥 "Algo salió mal"

⛓️ Encadenar Promesas

Una de las mayores ventajas de las promesas es que permiten encadenar acciones asíncronas sin caer en el infame callback hell 😱.

obtenerUsuario()
  .then(usuario => obtenerPedidos(usuario.id))
  .then(pedidos => procesarPedidos(pedidos))
  .then(resultado => console.log("Procesado ✅", resultado))
  .catch(error => console.error("Error ❌", error));

Cada .then() devuelve una nueva promesa, lo que hace posible este flujo secuencial y legible.

Para entender cuándo se ejecutan esos callbacks respecto al resto del código, revisa el Event Loop y la cola de microtareas.

🧠 Ejemplo práctico: simulando una API

Veamos un ejemplo completo donde simulamos una petición a un servidor:

function obtenerDatos() {
  return new Promise((resolve, reject) => {
    console.log("⏳ Solicitando datos...");

    setTimeout(() => {
      const exito = Math.random() > 0.3; // 70% de éxito

      if (exito) {
        resolve({mensaje: "Datos recibidos correctamente 📦"});
      } else {
        reject("Error al obtener datos del servidor 💣");
      }
    }, 2000);
  });
}

obtenerDatos()
  .then(res => console.log(res.mensaje))
  .catch(err => console.error(err));

🔄 Comparación con async/await

La sintaxis async/await es una forma más moderna y elegante de trabajar con Promesas. Esencialmente, es azúcar sintáctica que hace que el código luzca más “sincrónico”. 🍬

async function ejecutar() {
  try {
    const resultado = await obtenerDatos();
    console.log(resultado.mensaje);
  } catch (error) {
    console.error("Error capturado:", error);
  }
}

ejecutar();
EstiloVentajasCuándo usarlo
.then() y .catch()Ideal para cadenas de procesos simples o control detallado de cada paso.Cuando necesites múltiples promesas encadenadas.
async/awaitMás limpio, fácil de leer, similar al código sincrónico.Cuando quieras un flujo lineal y natural.

🚫 Errores comunes con Promesas

❌ Olvidar el return

Si no devuelves la promesa dentro de un .then(), el encadenamiento se rompe.

// Incorrecto ❌
then(() => {
  procesarDatos(); // no se devuelve nada
})

  // Correcto ✅
  .then(() => {
    return procesarDatos();
  })

❌ No manejar errores

Cada promesa debe tener su .catch() o estar dentro de un try/catch si usas async/await.

obtenerDatos()
  .then(res => console.log(res))
// Falta catch: si falla, el error se pierde 💥

🧩 Promesas útiles en la práctica

JavaScript incluye varias utilidades integradas para trabajar con múltiples promesas:

MétodoDescripciónEjemplo
Promise.all()Espera a que todas las promesas se resuelvan.Promise.all([p1, p2])
Promise.allSettled()Espera a que todas terminen (sin importar si fallan).Promise.allSettled([p1, p2])
Promise.race()Devuelve el resultado de la primera que termine.Promise.race([p1, p2])
Promise.any()Devuelve la primera que se resuelva correctamente.Promise.any([p1, p2])

Ejemplo con Promise.all()

const promesa1 = new Promise(res => setTimeout(() => res("🍎"), 1000));
const promesa2 = new Promise(res => setTimeout(() => res("🍌"), 2000));

Promise.all([promesa1, promesa2])
  .then(frutas => console.log("Frutas listas:", frutas)) // ["🍎", "🍌"]
  .catch(console.error);

💡 Buenas prácticas

✅ Siempre maneja errores (.catch() o try/catch). ✅ Evita anidar promesas; usa encadenamiento. ✅ Usa nombres claros para las funciones asíncronas. ✅ Prefiere async/await cuando quieras un flujo más natural.

🎯 Conclusión

Las Promesas transformaron la manera en que JavaScript maneja la asincronía. Comprenderlas es clave para dominar el lenguaje y escribir código más limpio, eficiente y fácil de mantener. 🚀

Prometer no cuesta nada… cumplir, en cambio, requiere práctica. 😉

#javascript#promesas#promises#async#await#programación asíncrona#callbacks

Artículos relacionados