Saltar al contenido
Curso de JavaScript
Todos los cursos

Ejercicio: Asincronía y APIs

  • ⏱ 45 minutos
  • 📶 Nivel: principiante

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.

▶ Prueba tu código aquí (opcional)
Consola

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.

    app.js
    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).