JavaScript
Web APIs
HTTP
Fetch
then / catch
Con then configuramos una función que trata la respuesta, y con catch configuramos otra función que tratará posibles errores durante la recepción de la misma:
fetch('URL', {
method: 'POST',
mode: 'cors',
headers: {'Accept': 'application/json', 'Content-Type': 'application/json'},
body: JSON.stringify({cuerpo: 'peticion'})
}).then(respuesta => {
if (respuesta.ok) {
return respuesta.json();
} else {
throw respuesta.status;
}
}).then(json => {
console.log('Respuesta OK:', json);
// A continuación viene código que usa objeto del json ...
}).catch(error => {
console.error('Error inexperado:', error);
// A continuación viene código que trata el error ...
});
<body>
<div class="card">
<div class="card-header">Mensajes</div>
<div class="card-body row">
<div class="col text-center">
<h5 id="titulo" class="card-title">No tienes mensajes</h5>
<p id="mensaje" class="card-text"><i class="bi bi-chat" style="font-size: 4rem; color:gray;"></i></p>
<button id="boton" type="button" class="btn btn-primary" onclick="actualizar()">Actualizar</button>
</div>
</div>
<div id="estado" class="card-footer text-muted">Sin actualizar</div>
</div>
</body>
const peticion = function() {
fetch('https://httpstat.us/200?' + new URLSearchParams({sleep: 4000}), {
method: 'GET',
mode: 'cors',
headers: {'Accept': 'application/json', 'Content-Type': 'application/json'}
}).then(respuesta => {
if (respuesta.ok) {
return respuesta.json();
} else {
throw respuesta.status;
}
}).then(objeto => {
mostrarMensajes(objeto);
}).catch(error => {
mostrarError(error);
});
}
// Lógica para cambiar la interfaz de usuario en función
// de la respuesta recibida:
const boton = document.getElementById('boton');
const estado = document.getElementById('estado');
const mostrarMensajes = function(mensajes) {
cambiaEstadoBoton('enabled');
estado.textContent = `0 mensajes - Actualizado a las ${new Date().toLocaleTimeString()}`;
}
const mostrarError = function(error) {
cambiaEstadoBoton('enabled');
estado.innerHTML = `<i class="bi bi-exclamation-triangle-fill"></i> Error al actualizar (${error})`;
}
const mostrarActualizando = function() {
cambiaEstadoBoton('disabled');
estado.innerHTML = '<div class="spinner-border spinner-border-sm"></div> Actualizando...';
}
const cambiaEstadoBoton = function(estado) {
boton.disabled = estado === 'disabled';
}
const actualizar = function() {
mostrarActualizando();
peticion();
}
html { font-size: 75%; padding: 2rem; }❓ Pregunta: ¿Para qué crees que vale el
URLSearchParamsde la query de la URL? ¿Y las cabeceras HTTP? (pista).
❓ Ejercicio: Añade trazas al código anterior para ver qué se ejecuta cuando la URL de la petición es:
https://httpstat.us/500https://invalid.us/