JavaScript
Web APIs
HTTP
Fetch
async
/ await
Con await
esperamos a que la operación asíncrona termine (la promesa), y con async
marcamos aquellas funciones que en su interior tienen operaciones asíncronas (tienen await
y/o retornan promesas). Con este sistema se consigue un código sin funciones anidadas más sencillo de seguir:
const peticion = async function() {
try {
const respuesta = await fetch('URL', {
method: 'POST',
mode: 'cors',
headers: {'Accept': 'application/json', 'Content-Type': 'application/json'},
body: JSON.stringify({cuerpo: 'peticion'}),
});
if (respuesta.ok) {
const objeto = await respuesta.json();
console.log('Respuesta OK:', objeto);
return objeto;
} else {
console.log('Respuesta KO:', respuesta.status);
throw respuesta;
}
} catch (error) {
console.error('Error inexperado:', error);
throw error;
}
}
const objetoRespuesta = await peticion();
❓ Ejercicio: Cambia el código del ejemplo anterior para que en utilice
async
yawait
.<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 = async function() { // Completar ... } // 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; }