Promise.all(): Ejecutar Múltiples Promesas en Paralelo
Domina Promise.all() para ejecutar múltiples promesas simultáneamente y esperar a que todas terminen.
TL;DR - Resumen rápido
- Promise.all() ejecuta múltiples promesas en paralelo simultáneamente
- Espera a que TODAS las promesas se resuelvan o se rechacen
- Si una promesa falla, Promise.all() se rechaza inmediatamente
- Retorna un array con los resultados en el mismo orden de las promesas
- Acepta valores no-promesa y los envuelve automáticamente con Promise.resolve()
Introducción a Promise.all()
Promise.all() es un método estático de Promise que te permite ejecutar múltiples promesas en paralelo y esperar a que todas terminen. A diferencia dePromise.race() que espera a la primera promesa que se resuelva o rechace, Promise.all() espera a que TODAS las promesas se completen. Esto lo hace ideal para operaciones independientes que pueden ejecutarse simultáneamente sin depender unas de otras.
El caso de uso más común de Promise.all() es cuando necesitas hacer múltiples peticiones de red en paralelo, como obtener datos de diferentes APIs al mismo tiempo. En lugar de esperar a que cada petición termine secuencialmente (lo que sería lento), Promise.all() permite que todas las peticiones ocurran simultáneamente, reduciendo el tiempo total de ejecución.
¿Por qué es útil?
Promise.all() es esencial para optimizar el rendimiento de aplicaciones que necesitan hacer múltiples operaciones asíncronas independientes. Permite paralelizar operaciones que de otra manera serían secuenciales, lo que puede reducir significativamente el tiempo de ejecución.
¿Qué es Promise.all()?
Promise.all() es un método estático que recibe un iterable de promesas (generalmente un array) y retorna una nueva promesa. Esta nueva promesa se resuelve cuando TODAS las promesas del iterable se resuelven, o se rechaza cuando CUALQUIERA de las promesas se rechaza. El resultado es un array con los valores de las promesas en el mismo orden en que fueron pasadas.
Comportamiento con Éxito
Cuando todas las promesas se resuelven exitosamente, Promise.all()se resuelve con un array que contiene los valores de cada promesa en el mismo orden en que fueron pasadas. El orden de los resultados en el array coincide exactamente con el orden de las promesas en el iterable original.
Este ejemplo muestra cómo Promise.all() se comporta cuando todas las promesas se resuelven exitosamente. Las tres promesas se ejecutan en paralelo, y Promise.all() espera a que todas terminen antes de resolverse. El resultado es un array con los valores en el mismo orden.
- <strong>Paralelismo</strong>: Todas las promesas se ejecutan simultáneamente
- <strong>Orden garantizado</strong>: Los resultados mantienen el orden original
- <strong>Array de resultados</strong>: Retorna un array con todos los valores
- <strong>Espera total</strong>: Se espera a que TODAS terminen
- <strong>Independencia</strong>: Las promesas no dependen unas de otras
Comportamiento con Fallo
Cuando AL MENOS una promesa se rechaza, Promise.all() se rechaza inmediatamente con el motivo de la primera promesa que falla. No espera a que las demás promesas terminen o fallen; el rechazo es inmediato. Esto es importante para manejo de errores, ya que te permite detectar y responder rápidamente a fallos en operaciones críticas.
Este ejemplo muestra cómo Promise.all() se comporta cuando una promesa falla. La promesa 2 se rechaza después de 500ms, lo que causa quePromise.all() se rechace inmediatamente. Las promesas 1 y 3 siguen ejecutándose en paralelo, pero sus resultados se pierden porquePromise.all() ya se rechazó.
Rechazo Inmediato
Promise.all() se rechaza inmediatamente cuando la primera promesa falla. No espera a que las demás promesas terminen. Esto es útil para fail-fast en operaciones críticas donde necesitas detener la ejecución lo antes posible ante cualquier error.
Casos de Uso de Promise.all()
Promise.all() es útil en varios escenarios donde necesitas ejecutar múltiples operaciones asíncronas independientes simultáneamente. Los casos de uso más comunes incluyen peticiones de red en paralelo, cargar múltiples recursos, o ejecutar múltiples operaciones de base de datos al mismo tiempo.
Este ejemplo muestra un caso de uso práctico de Promise.all() para cargar múltiples recursos en paralelo. Primero cargamos los datos del usuario, luego cargamos sus posts y sus comentarios simultáneamente. SinPromise.all(), tendríamos que esperar a que cada petición termine secuencialmente, lo que sería más lento.
- <strong>Peticiones en paralelo</strong>: Hacer múltiples fetch simultáneamente
- <strong>Carga de recursos</strong>: Cargar múltiples archivos o imágenes a la vez
- <strong>Operaciones de BD</strong>: Ejecutar múltiples queries en paralelo
- <strong>Validación en lote</strong>: Validar múltiples datos simultáneamente
- <strong>Agregación de datos</strong>: Combinar resultados de múltiples APIs
Errores Comunes con Promise.all()
Estos son los errores más frecuentes que encontrarás al trabajar conPromise.all(), especialmente cuando estás aprendiendo o migrando código de callbacks. Conocer estos errores te ayudará a evitarlos y a escribir código más robusto.
Error 1: Pasar un Array Vacío
Uno de los errores más comunes es pasar un array vacío aPromise.all(). Esto causa que la promesa se resuelva inmediatamente con un array vacío, lo que puede causar errores en el código que espera procesar los resultados. Siempre asegúrate de pasar al menos una promesa a Promise.all().
Este ejemplo muestra el error de pasar un array vacío aPromise.all(). La promesa se resuelve inmediatamente con un array vacío [], lo que puede causar que el código que espera procesar los resultados falle o se comporte de manera inesperada. Siempre valida que el array tenga al menos un elemento.
Promise.all() Acepta Valores No-Promesa
A diferencia de lo que muchos piensan, Promise.all() NO requiere que todos los valores sean promesas. Acepta cualquier valor y automáticamente envuelve valores no-promesa usando Promise.resolve(). Esto es comportamiento ESPERADO y diseñado, no un error.
Este ejemplo muestra que Promise.all() acepta valores mixtos: promesas, strings, números y objetos. Los valores no-promesa se envuelven automáticamente con Promise.resolve() y funcionan perfectamente. El único error real es pasar algo que NO sea un iterable (como un número o string directamente en lugar de un array).
Promise.all() acepta cualquier valor
Promise.all() acepta un iterable con CUALQUIER valor: promesas, primitivos, objetos o arrays. Los valores no-promesa se envuelven automáticamente conPromise.resolve(). Esto es comportamiento diseñado y perfectamente válido. El único requisito es que el argumento sea un iterable (array, Set, Map, etc.).
Resumen: Promise.all()
Conceptos principales:
- •Promise.all() ejecuta múltiples promesas en paralelo simultáneamente
- •Espera a que TODAS las promesas se resuelvan o se rechacen
- •Si una falla, Promise.all() se rechaza inmediatamente
- •Retorna un array con los resultados en el orden original
- •Acepta valores no-promesa y los envuelve con Promise.resolve()
Mejores prácticas:
- •Usa Promise.all() para operaciones independientes que pueden ejecutarse en paralelo
- •Siempre valida que el array tenga al menos una promesa
- •Maneja el rechazo inmediato para fail-fast en operaciones críticas
- •Usa Promise.allSettled() si necesitas los resultados de todas las promesas
- •Considera Promise.race() si necesitas el resultado de la primera promesa
- •Evita usar Promise.all() para operaciones que dependen unas de otras