← JavaScript

Asincronía

¿Qué es una Promise y cuáles son sus estados?

Ver respuesta — intenta responderla en voz alta primero

Una Promise es un objeto que representa el resultado futuro de una operación asíncrona. Tiene tres estados: pendiente, cumplida (resuelta con éxito) y rechazada (falló con un error). Se manejan con .then(), .catch() y .finally().

Una promesa es como un vale por un valor que todavía no está listo. Cuando inicias una tarea asíncrona, esta devuelve una promesa que estará:

  • pendiente: la tarea aún no ha terminado.
  • cumplida: terminó con éxito y tiene un valor (se accede con .then()).
  • rechazada: falló y tiene un error (se captura con .catch()).

Una vez que pasa de pendiente a cumplida o rechazada, ya no vuelve a cambiar. Las promesas se pueden encadenar con .then(), y cada .then() devuelve una nueva promesa.

// Crear una promesa
const promesa = new Promise((resolve, reject) => {
  const exito = true;
  if (exito) {
    resolve("¡Datos listos!"); // pasa a cumplida
  } else {
    reject("Algo falló"); // pasa a rechazada
  }
});

// Consumirla
promesa
  .then((resultado) => console.log(resultado)) // "¡Datos listos!"
  .catch((error) => console.log(error))
  .finally(() => console.log("Terminado (con éxito o no)"));

// Encadenar promesas: cada then devuelve una nueva promesa
Promise.resolve(2)
  .then((n) => n * 2)   // 4
  .then((n) => n + 1)   // 5
  .then((n) => console.log(n)); // 5

// Ejecutar varias en paralelo
Promise.all([Promise.resolve(1), Promise.resolve(2)])
  .then((resultados) => console.log(resultados)); // [1, 2]
  • Olvidar el .catch() y dejar errores sin manejar.
  • No retornar dentro de un .then() al encadenar: si no devuelves el valor (o la siguiente promesa), el .then() siguiente recibe undefined.
  • Pensar que .then() se ejecuta de inmediato; en realidad es asíncrono y se ejecuta después del código síncrono.

"Una Promise representa el resultado futuro de una operación asíncrona. Tiene tres estados: pendiente mientras la tarea se ejecuta, cumplida si termina con éxito, y rechazada si falla. Manejo el éxito con .then(), los errores con .catch(), y lo que siempre debe ejecutarse con .finally(). Las puedo encadenar porque cada .then() devuelve una nueva promesa, y para ejecutar varias a la vez uso Promise.all. Lo clave es siempre manejar los errores con .catch()."

Reto rápido

¿Qué imprime esto?

Promise.resolve(10)
  .then((n) => n + 5)
  .then((n) => console.log(n));
Ver respuesta

Imprime 15. El primer .then() recibe 10, le suma 5 y devuelve 15, que se pasa al segundo .then().