Promesa (JavaScript)
Un objeto de JavaScript que representa un resultado que todavía no ha llegado y que estará disponible (o fallará) más adelante.
Una promesa empieza pendiente y termina cumplida (con un valor) o rechazada (con un error). Funciones como fetch() devuelven promesas.
Para usar el valor se encadena .then() o, de forma más legible, se escribe await dentro de una función async. Otros lenguajes tienen ideas equivalentes, como Task en C# o Future en Rust.
Un ejemplo
fetch(url) devuelve al instante una promesa; cuando el servidor responde, la promesa se cumple con la respuesta.
Por qué importa
Una promesa representa un resultado que llegará en el futuro y que todavía no conoces. Es la forma moderna de trabajar con operaciones asíncronas en JavaScript: fetch devuelve una, y la mayoría de bibliotecas actuales también. Sustituyen a las antiguas funciones de retorno anidadas, que acababan formando el famoso «infierno de callbacks».
Se pueden encadenar con .then() para que cada paso espere al anterior, y combinar varias con Promise.all para lanzarlas a la vez y esperar a que todas terminen. Con async/await se escriben de una forma que parece código secuencial, aunque por debajo siguen siendo promesas.
Confusiones frecuentes
Una promesa tiene tres estados: pendiente, cumplida o rechazada, y una vez resuelta ya no cambia. Un fallo habitual es creer que fetch rechaza la promesa cuando el servidor responde con un error 404 o 500: no lo hace, solo se rechaza ante fallos de red, y debes comprobar respuesta.ok. Otro error es no tratar el rechazo, que acaba en un aviso de «unhandled promise rejection». Y .then() devuelve siempre otra promesa, no el valor directamente.
Preguntas frecuentes
¿Cuál es la diferencia entre `Promise.all` y `Promise.allSettled`?
Promise.all se rechaza en cuanto una falla. Promise.allSettled espera a todas y devuelve el estado de cada una, sea cumplida o rechazada.
¿Puedo crear mi propia promesa?
Sí, con new Promise((resolve, reject) => { ... }), llamando a resolve con el valor o a reject con el error.
Fuentes consultadas
- Promise (MDN Web Docs)