Ejercicio: Asincronía y APIs
Objetivo
Escribir funciones asíncronas: promesas con temporizador, peticiones con fetch y gestión de errores, varias peticiones en paralelo y reintentos. La red se simula en las pruebas para que el resultado sea siempre el mismo.
Antes de empezar
Estas funciones no necesitan una página. En el editor puedes probarlas con console.log; el comprobador simula fetch para que las pruebas no dependan de internet.
Pasos
Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.
💡 Pista 1: `esperar`
return new Promise(resolver => setTimeout(() => resolver("listo"), ms));
💡 Pista 2: errores en `nombreUsuario`
Envuelve el await obtenerUsuario(id) en try { … } catch { return "desconocido"; }.
🔎 Comprueba tu trabajo
Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista.
✅ Ver una solución de ejemplo
Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.
function esperar(ms) {
return new Promise((resolver) => {
setTimeout(() => resolver("listo"), ms);
});
}
async function obtenerUsuario(id) {
const respuesta = await fetch(`https://api.ejemplo.com/usuarios/${id}`);
if (!respuesta.ok) {
throw new Error("Error " + respuesta.status);
}
return await respuesta.json();
}
async function nombreUsuario(id) {
try {
const usuario = await obtenerUsuario(id);
return usuario.nombre;
} catch {
return "desconocido";
}
}
async function cargarVarios(ids) {
const usuarios = await Promise.all(ids.map((id) => obtenerUsuario(id)));
return usuarios.map((u) => u.nombre);
}
function contarAtras(n, alTerminar) {
setTimeout(() => alTerminar(), n * 10);
}
async function conReintentos(tarea, intentos) {
let ultimoError;
for (let i = 0; i < intentos; i++) {
try {
return await tarea();
} catch (error) {
ultimoError = error;
}
}
throw ultimoError;
}
💡 🏁 Reto extra (opcional)
Escribe conTiempoLimite(promesa, ms) que rechace con new Error("Tiempo agotado") si la promesa tarda más de ms milisegundos (pista: Promise.race).