Este artículo fue originalmente escrito en https://matiashernandez.dev
En la versión ECMAScript 2021, el estándar agregó un nuevo método estático al objeto Promise
. Este método te permite manejar múltiples promesas de forma concurrente, pero a diferencia de Promise.all
este método
espera a que todas las promesas hayan sido establecidas sin importar si estas fueron resueltas o rechazadas.
En el articulo anterior revisamos como ejeuctar Promesas de forma concurrente utilizando Promise.all, [Revisalo aqui][https://matiashernandez.dev/blog/post/ejecuta-codigo-asincrono-de-forma-concurrente-en-javascript]
Y si quieres saber mas sobre Promesas, puedes revisar este articulo introductorio: ¿WTF es una promesa en JS?
Este método es muy similar a Promise.all
, en efecto comparten la misma sintaxis y forma de uso, lo que cambia es el resultado que retorna.
const promise1 = getData("userId")
const promise2 = getData("anotherUser")
const result = await Promise.allSettled([ promise1, promise2])
Cabe destacar que el orden del arreglo retornado corresponde con el orden de las promesas utilizadas como argumento
Lo importante de entender es que Promise.allSettled
:
- Esperará por todas las promesas sin importar su resultado
- El resultado de cada promesa será de la forma
{status: "fulfilled", value: <result>}
o{status: "rejected", reason: <el error>}
Esto te permite filtrar los resultados basándose en el estado de cada promesa resuelta.
const promise1 = getData("userId")
const promise2 = getData("anotherUser")
const promise3 = performLongOp()
const promise4 = anotherOp()
const result = await Promise.allSettled([ promise1, promise2, promise3, promise4 ])
const fulfilled = results.filter(
(p) =>p.status === 'fulfilled'
)
Si estás usando Typescript entonces tendrás que aplicar una función de predicado para que el filtro define el tipo correcto
(p): p is Extract<typeof p, { status: 'fulfilled' }>
¿Cuál es la diferencia entre Promise.allSettled y Promise.all?
-
Promise.allSettled
es tu opción si lo que buscas es ejecutar múltiples operaciones asíncronas de forma concurrente cuando estas no dependen entre sí y tampoco dependen de si una u otra fue exitosa en su operación. - También te será útil si lo que buscas es conocer el resultado de cada operación asíncrona.
-
Promise.all
es completamente rechazado si una o más promesas utilizadas como argumentos también lo fueron.
✉️ Únete a Micro-bytes 🐦 Sígueme en Twitter ❤️ Apoya mi trabajo
Top comments (0)