JavaScript de Cero a Experto / Asincronía I
Promesas II: fabricarlas con new Promise
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.