CodeForge

JavaScript de Cero a Experto / Asincronía I

Promesas II: fabricarlas con new Promise

Teoría20 min20 XP

Ya usaste el localizador como cliente; hoy pasas a la cocina y fabricas el aparato. new Promise es el constructor con el que envuelves cualquier operación asíncrona — y tu primera obra será esperar(ms), la promesa que todo desarrollador JavaScript escribe alguna vez y usa mil.

La cocina del localizador

Léelo como fábrica: el ejecutor corre YA (por eso el "1" sale primero), el trabajo lento queda andando, y tarde o temprano alguien presiona un botón. Lo que le pases a resolve viaja al .then; lo que le pases a reject (siempre un new Error, como profesional), al .catch. Y el segundo resolve no hace nada: el primer botón ya había ganado.

Tu primera herramienta: esperar(ms)

setTimeout es de la era de los callbacks. Envuélvelo UNA vez en una promesa y queda modernizado para siempre — a esto se le llama promisificar:

Detalles de la miniatura: no hay reject porque una pausa no puede fallar (el parámetro se puede omitir), y setTimeout(resolve, ms) es la elegancia de pasar resolve directo como callback — la función como valor, módulo 3. El return esperar(...) dentro de cada .then es la clave del encadenado… y el protagonista absoluto de la próxima lección.

¿Cuándo fabricarás promesas de verdad?

Nota honesta: menos de lo que crees. fetch y las APIs modernas YA devuelven promesas — las consumes, no las fabricas. new Promise se reserva para dos escenarios: envolver APIs viejas de callbacks (promisificar, como hiciste con setTimeout) y construir simuladores o utilidades propias (como esperar, o los servidores falsos de este módulo). Si te encuentras envolviendo en new Promise algo que ya devuelve una promesa, detente: ese antipatrón hasta tiene nombre en las revisiones de código.

Fabricas: new Promise((resolve, reject) => { resolve(10); reject(new Error('tarde')); resolve(20); }) y le cuelgas .then y .catch. ¿Qué pasa?

Mini-reto

Fabrica el servidor de "Mi Bolsillo" en versión promesa: consultarGastos(mes) devuelve una promesa que espera 1200ms y luego — si mes === "julio" — resuelve con un array de 3 gastos; si no, rechaza con new Error y un mensaje que incluya el mes pedido (template literal). Consúmela dos veces: con "julio" (.then que imprima cuántos gastos llegaron) y con "junio" (.catch mostrando el .message). Este simulador es EXACTAMENTE el que usará el reto del módulo: déjalo fino.

Qué sigue

Ya viste el return esperar(...) dentro de un .then haciendo magia. Esa magia tiene reglas — qué retorna then, qué pasa si retornas un valor vs una promesa, cómo UN solo catch cubre la cadena entera — y con ellas vas a APLANAR la pirámide de la lección 3 en código que se lee de arriba a abajo. La próxima lección cierra la teoría del módulo.