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 completada
Ejercicio 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 completada
Solució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