Promise.allSettled(): Espera a Todas las Promesas en JavaScript
Aprende a usar Promise.allSettled() para esperar a que todas las promesas se completen, independientemente de si se resuelven o rechazan. Ideal para escenarios donde necesitas conocer el resultado de cada operación individual.
TL;DR - Resumen rápido
- Promise.allSettled() espera a que TODAS las promesas se completen, ya sea resueltas o rechazadas
- Devuelve un array de objetos con el estado (status) y el valor o razón de cada promesa
- A diferencia de Promise.all(), NUNCA se rechaza, incluso si algunas promesas fallan
- Es ideal para escenarios donde necesitas saber el resultado de cada operación individual
- Cada objeto del resultado tiene la propiedad status: 'fulfilled' o 'rejected'
Introducción a Promise.allSettled()
Promise.allSettled() es un método estático del objeto Promise introducido en ES2020 que permite ejecutar múltiples promesas en paralelo y esperar a que TODAS se completen, independientemente de si se resuelven exitosamente o se rechazan. A diferencia de Promise.all(), que se rechaza inmediatamente si alguna promesa falla, Promise.allSettled() siempre se resuelve con información sobre todas las promesas.
Este método es particularmente útil cuando necesitas ejecutar múltiples operaciones asíncronas y quieres conocer el resultado de cada una, incluso si algunas fallan. Es ideal para escenarios como batch processing, validación de múltiples recursos, o cuando necesitas mostrar al usuario qué operaciones tuvieron éxito y cuáles fallaron.
Diferencia clave con Promise.all()
Promise.all() se rechaza inmediatamente si ALGUNA promesa se rechaza, mientras que Promise.allSettled() espera a que TODAS las promesas se completen y devuelve información sobre cada una. Esto hace que Promise.allSettled() sea ideal para escenarios donde necesitas el resultado de todas las operaciones, incluso si algunas fallan.
Sintaxis Básica
La sintaxis de Promise.allSettled() es similar a otros métodos de Promise. Recibe un iterable (generalmente un array) de promesas y devuelve una nueva promesa que se resuelve con un array de objetos, cada uno describiendo el resultado de una promesa.
En este ejemplo, tenemos tres promesas: una se resuelve exitosamente, otra se rechaza, y la tercera también se resuelve. Promise.allSettled() espera a que todas se completen y devuelve un array con tres objetos. Cada objeto tiene una propiedad `status` que indica si la promesa se cumplió ('fulfilled') o se rechazó ('rejected'), y una propiedad `value` (si se cumplió) o `reason` (si se rechazó).
Estructura del resultado
Cada objeto en el resultado de Promise.allSettled() tiene la forma: un objeto con la propiedad status que puede ser "fulfilled" o "rejected". Para promesas exitosas, incluye la propiedad value con el resultado. Para promesas fallidas, incluye la propiedad reason con el error.
Cómo Funciona Promise.allSettled()
Promise.allSettled() sigue un comportamiento determinista basado en el estado de las promesas que recibe. Entender este comportamiento es crucial para usarlo correctamente y aprovechar al máximo su funcionalidad.
- <strong>Espera a todas:</strong> Promise.allSettled() espera a que TODAS las promesas se completen, ya sea resueltas o rechazadas.
- <strong>Nunca se rechaza:</strong> A diferencia de Promise.all(), Promise.allSettled() NUNCA se rechaza, siempre se resuelve.
- <strong>Resultado detallado:</strong> Devuelve un array de objetos con información detallada sobre cada promesa.
- <strong>Orden garantizado:</strong> El resultado mantiene el mismo orden que las promesas originales.
- <strong>Iterable vacío:</strong> Si el iterable está vacío, Promise.allSettled() se resuelve con un array vacío.
Diferencias con Promise.all()
Es fundamental entender las diferencias entre Promise.allSettled() y Promise.all() para elegir el método correcto según tu caso de uso.
Este ejemplo muestra claramente la diferencia: Promise.all() se rechaza inmediatamente cuando la primera promesa falla, sin esperar a las demás. Promise.allSettled(), por otro lado, espera a que todas las promesas se completen y devuelve información sobre cada una. Promise.allSettled() es "completo" - te da el resultado de todas las operaciones, mientras que Promise.all() es "estricto" - requiere que todas tengan éxito.
Cuándo usar cada uno
Usa Promise.all() cuando necesitas que TODAS las operaciones tengan éxito para continuar (ej: dependencias entre operaciones). Usa Promise.allSettled() cuando necesitas el resultado de todas las operaciones, incluso si algunas fallan (ej: batch processing, validación de múltiples recursos).
Casos de Uso Prácticos
Promise.allSettled() tiene aplicaciones prácticas específicas donde brilla realmente en aplicaciones del mundo real, especialmente en escenarios donde necesitas información detallada sobre múltiples operaciones asíncronas.
Procesamiento por Lotes
Cuando necesitas procesar múltiples operaciones en lote y quieres saber cuáles tuvieron éxito y cuáles fallaron, Promise.allSettled() es la herramienta perfecta.
En este ejemplo, intentamos guardar múltiples registros en una base de datos. Algunos guardados tienen éxito y otros fallan. Promise.allSettled() nos permite saber exactamente cuáles operaciones tuvieron éxito y cuáles fallaron, para que podamos mostrar al usuario un resumen detallado. Es un patrón común en aplicaciones de administración y sistemas de procesamiento de datos.
Filtrar y Procesar Resultados
Una vez que tienes los resultados de Promise.allSettled(), puedes filtrar y procesar los resultados según tus necesidades.
Aquí, usamos los métodos `filter()` y `map()` para separar las promesas exitosas de las fallidas. Esto te permite procesar los resultados exitosos y manejar los errores de manera diferente. Es un patrón muy útil cuando necesitas tomar acciones específicas según el resultado de cada operación.
Errores Comunes
Al trabajar con Promise.allSettled(), hay varios errores que los desarrolladores cometen frecuentemente. Conocer estos errores te ayudará a evitarlos y escribir código más robusto.
- <strong>No verificar el status:</strong> Es importante verificar siempre la propiedad status antes de acceder a value o reason.
- <strong>Confundir con Promise.all():</strong> Promise.allSettled() nunca se rechaza, Promise.all() sí. Usar el incorrecto puede causar comportamiento inesperado.
- <strong>Ignorar el orden:</strong> El resultado mantiene el mismo orden que las promesas originales, no el orden de finalización.
- <strong>No manejar errores individuales:</strong> Aunque Promise.allSettled() no se rechaza, debes manejar los errores individuales en el resultado.
- <strong>No validar el iterable:</strong> Pasar un iterable vacío causará que Promise.allSettled() se resuelva con un array vacío.
Advertencia: Acceso a propiedades incorrectas
Si intentas acceder a `value` en una promesa rechazada o `reason` en una promesa resuelta, obtendrás `undefined`. Siempre verifica la propiedad `status` antes de acceder a `value` o `reason` para evitar errores en tu código.
Resumen: Promise.allSettled()
Conceptos principales:
- •Promise.allSettled() espera a que TODAS las promesas se completen, ya sea resueltas o rechazadas
- •Devuelve un array de objetos con el estado (status) y el valor o razón de cada promesa
- •A diferencia de Promise.all(), NUNCA se rechaza, incluso si algunas promesas fallan
- •Cada objeto del resultado tiene la propiedad status: 'fulfilled' o 'rejected'
- •El resultado mantiene el mismo orden que las promesas originales
- •Es ideal para escenarios donde necesitas conocer el resultado de cada operación individual
Mejores prácticas:
- •Usa Promise.allSettled() cuando necesites el resultado de todas las operaciones, incluso si algunas fallan
- •Siempre verifica la propiedad status antes de acceder a value o reason
- •Usa filter() y map() para procesar los resultados según tus necesidades
- •Usa Promise.all() cuando necesites que todas las operaciones tengan éxito para continuar
- •Considera Promise.any() si solo necesitas una operación exitosa
- •Muestra al usuario información detallada sobre qué operaciones tuvieron éxito y cuáles fallaron