¿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 recibeundefined. - 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 usoPromise.all. Lo clave es siempre manejar los errores con.catch()."
¿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().