Lección 11 · 11 de 20
Promesas · JavaScript
Aprenda cómo funcionan las promesas en JavaScript: resolve y reject, cadenas de then, catch para los errores y finally para cerrar.

Una promesa representa un resultado que todavía no existe: empieza pendiente y termina cumplida (con un valor) o rechazada (con un error). checkStock crea una con new Promise, que recibe dos funciones: llama a resolve cuando tiene el dato y a reject cuando algo va mal. El setTimeout de 50 ms simula la espera de un almacén o de un servidor.
Fíjese en el orden de la salida: la línea 2 aparece antes que la 3, aunque está al final del programa. JavaScript no se detiene a esperar la promesa; sigue ejecutando el código y, cuando llega la respuesta, ejecuta las funciones registradas con `then`.
Cada then devuelve una promesa nueva, así que se pueden encadenar: lo que devuelve un then (aquí, info.units * 899) es lo que recibe el siguiente. Si devuelve otra promesa, como checkStock("mouse"), la cadena espera a que esta se resuelva.
Cuando una promesa se rechaza, la cadena salta todos los then hasta el primer `catch`: por eso no aparece This line is skipped. `finally` se ejecuta al final pase lo que pase, ideal para cerrar una conexión u ocultar un indicador de carga. En la próxima lección verá async/await, que permite escribir lo mismo como código secuencial.
Código · main.js
const stock = { laptop: 3, mouse: 0 };// A promise stands for a result that arrives later.function checkStock(product) { return new Promise((resolve, reject) => { setTimeout(() => { if (!(product in stock)) reject(new Error(`Unknown product: ${product}`)); else if (stock[product] === 0) reject(new Error(`${product} is out of stock`)); else resolve({ product, units: stock[product] }); }, 50); // pretend the warehouse takes 50 ms to answer });}console.log("1. Asking the warehouse...");checkStock("laptop") .then((info) => { console.log(`3. ${info.units} units of ${info.product}`); return info.units * 899; // the next then receives this value }) .then((value) => { console.log(`4. Stock value: ${value} EUR`); return checkStock("mouse"); // returning a promise: the chain waits for it }) .then(() => console.log("This line is skipped")) .catch((err) => console.log("5. Error:", err.message)) .finally(() => console.log("6. Request closed"));console.log("2. This line runs before the answer arrives");Salida · node main.js
1. Asking the warehouse... 2. This line runs before the answer arrives 3. 3 units of laptop 4. Stock value: 2697 EUR 5. Error: mouse is out of stock 6. Request closed
Para recordar
- Una promesa está pendiente, cumplida o rechazada.
resolveentrega el valor yreject, el error.- Lo que devuelve un
thenllega al siguiente; si es una promesa, se espera. - Un rechazo salta hasta el primer
catch;finallyse ejecuta siempre.
Ejercicio
Cambie checkStock("laptop") por checkStock("tablet"), un producto que no existe, y observe qué pasos se saltan. Después ponga un catch intermedio que devuelva 0 para que la cadena continúe.