Introducción
En JavaScript, el manejo de operaciones asíncronas es esencial para crear aplicaciones web eficientes y responsivas. Las promesas y async/await son dos herramientas poderosas que facilitan el trabajo con código asíncrono. En esta sección, aprenderás cómo funcionan las promesas y cómo async/await puede simplificar su uso.
Promesas
¿Qué es una Promesa?
Una promesa es un objeto que representa la eventual finalización (o falla) de una operación asíncrona y su valor resultante. Una promesa puede estar en uno de tres estados:
- Pendiente (Pending): La operación aún no se ha completado.
- Cumplida (Fulfilled): La operación se completó con éxito.
- Rechazada (Rejected): La operación falló.
Creación de una Promesa
Para crear una promesa, se utiliza el constructor Promise, que toma una función con dos parámetros: resolve y reject.
const miPromesa = new Promise((resolve, reject) => {
// Simulamos una operación asíncrona con setTimeout
setTimeout(() => {
const exito = true; // Cambia a false para simular un error
if (exito) {
resolve('¡Operación exitosa!');
} else {
reject('Ocurrió un error.');
}
}, 2000);
});Consumo de una Promesa
Para manejar el resultado de una promesa, se utilizan los métodos then y catch.
miPromesa
.then((mensaje) => {
console.log(mensaje); // ¡Operación exitosa!
})
.catch((error) => {
console.error(error); // Ocurrió un error.
});Ejemplo Práctico
function obtenerDatos() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const datos = { id: 1, nombre: 'Juan' };
resolve(datos);
}, 1000);
});
}
obtenerDatos()
.then((datos) => {
console.log(datos); // { id: 1, nombre: 'Juan' }
})
.catch((error) => {
console.error(error);
});Async/Await
¿Qué es Async/Await?
async y await son palabras clave que permiten escribir código asíncrono de manera más clara y legible. async se utiliza para declarar una función asíncrona, y await se utiliza para esperar a que una promesa se resuelva.
Funciones Asíncronas
Una función declarada con async siempre devuelve una promesa.
async function miFuncionAsincrona() {
return '¡Hola!';
}
miFuncionAsincrona().then((mensaje) => console.log(mensaje)); // ¡Hola!Uso de Await
await solo puede ser utilizado dentro de funciones declaradas con async. Pausa la ejecución de la función hasta que la promesa se resuelva.
async function obtenerDatosAsync() {
try {
const datos = await obtenerDatos();
console.log(datos); // { id: 1, nombre: 'Juan' }
} catch (error) {
console.error(error);
}
}
obtenerDatosAsync();Ejemplo Práctico
function obtenerUsuario(id) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const usuario = { id, nombre: 'Ana' };
resolve(usuario);
}, 1000);
});
}
async function mostrarUsuario() {
try {
const usuario = await obtenerUsuario(2);
console.log(usuario); // { id: 2, nombre: 'Ana' }
} catch (error) {
console.error(error);
}
}
mostrarUsuario();Ejercicios Prácticos
Ejercicio 1: Promesas
Crea una función simularOperacion que devuelva una promesa que se resuelva después de 2 segundos con el mensaje "Operación completada".
function simularOperacion() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Operación completada');
}, 2000);
});
}
simularOperacion().then((mensaje) => console.log(mensaje)); // Operación completadaEjercicio 2: Async/Await
Crea una función obtenerMensajeAsync que utilice async/await para esperar a que simularOperacion se resuelva y luego imprima el mensaje.
async function obtenerMensajeAsync() {
const mensaje = await simularOperacion();
console.log(mensaje); // Operación completada
}
obtenerMensajeAsync();Soluciones
Solución Ejercicio 1
function simularOperacion() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Operación completada');
}, 2000);
});
}
simularOperacion().then((mensaje) => console.log(mensaje)); // Operación completadaSolución Ejercicio 2
async function obtenerMensajeAsync() {
const mensaje = await simularOperacion();
console.log(mensaje); // Operación completada
}
obtenerMensajeAsync();Conclusión
En esta sección, has aprendido sobre las promesas y cómo async/await puede simplificar el manejo de operaciones asíncronas en JavaScript. Ahora tienes las herramientas necesarias para trabajar con código asíncrono de manera más eficiente y legible. En el siguiente módulo, profundizaremos en el Modelo de Objetos del Documento (DOM) y cómo interactuar con él utilizando JavaScript.
JavaScript: De Principiante a Avanzado
Módulo 1: Introducción a JavaScript
- ¿Qué es JavaScript?
- Configuración de tu Entorno de Desarrollo
- Tu Primer Programa en JavaScript
- Sintaxis y Conceptos Básicos de JavaScript
- Variables y Tipos de Datos
- Operadores Básicos
Módulo 2: Estructuras de Control
- Sentencias Condicionales
- Bucles: for, while, do-while
- Sentencias Switch
- Manejo de Errores con try-catch
Módulo 3: Funciones
- Definición y Llamada de Funciones
- Expresiones de Función y Funciones Flecha
- Parámetros y Valores de Retorno
- Ámbito y Closures
- Funciones de Orden Superior
Módulo 4: Objetos y Arrays
- Introducción a los Objetos
- Métodos de Objeto y la Palabra Clave 'this'
- Arrays: Conceptos Básicos y Métodos
- Iteración sobre Arrays
- Desestructuración de Arrays
Módulo 5: Objetos y Funciones Avanzadas
- Prototipos y Herencia
- Clases y Programación Orientada a Objetos
- Módulos e Importación/Exportación
- JavaScript Asíncrono: Callbacks
- Promesas y Async/Await
Módulo 6: El Modelo de Objetos del Documento (DOM)
- Introducción al DOM
- Selección y Manipulación de Elementos del DOM
- Manejo de Eventos
- Creación y Eliminación de Elementos del DOM
- Manejo y Validación de Formularios
Módulo 7: APIs del Navegador y Temas Avanzados
- Almacenamiento Local y de Sesión
- Fetch API y AJAX
- WebSockets
- Service Workers y Aplicaciones Web Progresivas (PWAs)
- Introducción a WebAssembly
Módulo 8: Pruebas y Depuración
- Depuración de JavaScript
- Pruebas Unitarias con Jest
- Pruebas de Integración
- Pruebas de Extremo a Extremo con Cypress
Módulo 9: Rendimiento y Optimización
- Optimización del Rendimiento de JavaScript
- Gestión de Memoria
- Manipulación Eficiente del DOM
- Carga Perezosa y División de Código
Módulo 10: Frameworks y Librerías de JavaScript
- Introducción a React
- Gestión de Estado con Redux
- Conceptos Básicos de Vue.js
- Conceptos Básicos de Angular
- Elegir el Framework Adecuado
