Listo (Ctrl + Enter para ejecutar) Bootcamp Fullstack »
index.html
Tab = 4 espacios
1
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title>Promesas en JavaScript</title>
  <style>
    body { font-family: Arial, Helvetica, sans-serif; padding: 25px; background: #f8fafc; }
    .card-promesa { max-width: 500px; background: white; border: 1px solid #cbd5e1; border-radius: 8px; padding: 22px; }
    .grupo-acciones { display: flex; gap: 8px; margin-bottom: 15px; }
    button { padding: 9px 14px; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; }
    .btn-exito { background: #16a34a; color: white; }
    .btn-fallo { background: #dc2626; color: white; }
    button:disabled { opacity: 0.5; cursor: not-allowed; }
    .visor-estado { padding: 15px; border-radius: 6px; font-family: monospace; background: #f1f5f9; border-left: 4px solid #64748b; font-size: 0.9rem; min-height: 48px; display: flex; align-items: center; }
    .estado-pending { border-color: #f59e0b; background: #fffbeb; color: #b45309; }
    .estado-fulfilled { border-color: #22c55e; background: #f0fdf4; color: #166534; }
    .estado-rejected { border-color: #ef4444; background: #fef2f2; color: #991b1b; }
  </style>
</head>
<body>

  <div class="card-promesa">
    <h3 style="margin-top: 0; color: #0f172a;">Simulador de Promesas</h3>
    <p style="color: #64748b; font-size: 0.9rem;">Prueba solicitar una respuesta asíncrona (espera simulada de 1.5 segundos):</p>

    <div class="grupo-acciones">
      <button class="btn-exito" id="btn-ok" onclick="ejecutarPromesa(true)">Simular Respuesta Exitosa</button>
      <button class="btn-fallo" id="btn-bad" onclick="ejecutarPromesa(false)">Simular Error de Servidor</button>
    </div>

    <div class="visor-estado" id="caja-estado">Presiona un botón para crear una Promesa (Promise).</div>
  </div>

  <script>
    function crearPromesaSimulada(debeTriunfar) {
      return new Promise((resolve, reject) => {
        // Simulamos latencia de red de 1.5s
        setTimeout(() => {
          if (debeTriunfar) {
            resolve({ codigo: 200, mensaje: "¡Matrícula confirmada en Kilopolis!" });
          } else {
            reject(new Error("Error 500: Tiempo de espera agotado en la base de datos."));
          }
        }, 1500);
      });
    }

    function ejecutarPromesa(debeTriunfar) {
      const visor = document.getElementById('caja-estado');
      const btnOk = document.getElementById('btn-ok');
      const btnBad = document.getElementById('btn-bad');

      btnOk.disabled = true;
      btnBad.disabled = true;

      visor.className = "visor-estado estado-pending";
      visor.textContent = "⏳ Estado: PENDING (esperando respuesta del servidor)...";

      crearPromesaSimulada(debeTriunfar)
        .then(datos => {
          // Estado FULFILLED
          visor.className = "visor-estado estado-fulfilled";
          visor.textContent = `✓ Estado: FULFILLED -> ${datos.mensaje}`;
        })
        .catch(err => {
          // Estado REJECTED
          visor.className = "visor-estado estado-rejected";
          visor.textContent = `✕ Estado: REJECTED -> ${err.message}`;
        })
        .finally(() => {
          btnOk.disabled = false;
          btnBad.disabled = false;
        });
    }
  </script>

</body>
</html>
Haz clic para editar este código
Vista Previa
Consola Virtual JavaScript