Logo

dev-resources.site

for different kinds of informations.

¿Qué es Promise.allSettled y como usarlo?

Published at
3/23/2023
Categories
spanish
Author
Matías Hernández Arellano
Categories
1 categories in total
spanish
open
¿Qué es Promise.allSettled y como usarlo?

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.

Footer Social Card.jpg
✉️ Únete a Micro-bytes 🐦 Sígueme en Twitter ❤️ Apoya mi trabajo

Featured ones: