Detectar errores en Promise.all

Una alternativa segura a Promise.all de Javascript

Esperando todas las promesas, incluidos los errores

Si es un desarrollador de Javascript, lo más probable es que haya utilizado el objeto estándar integrado Promise y su API Promise.all, que espera hasta que se resuelvan todas las promesas proporcionadas en una matriz. Esta es una forma muy elegante de esperar varios resultados asincrónicos antes de continuar con su lógica empresarial.

Pero esta API no maneja errores. Siempre que ocurre al menos un error en la matriz de promesas, la función se detiene inmediatamente y no se esperan más resultados.

Promise.allSettled espera todos los resultados asíncronos

Afortunadamente, hay una segunda API llamada Promise.allSettled disponible que garantiza esperar todas las promesas, sin importar si el resultado es válido o un error. El siguiente código demuestra su uso, que es realmente simple, pero puede ahorrarle muchos dolores de cabeza.

La principal diferencia con Promise.all es que cada promesa se resuelve en una tupla de información, donde tanto el estado (cumplido o rechazado) como el valor (en caso de cumplido) o el motivo (en caso de rechazado) están disponibles. .

Proporcionar una matriz vacía

Un caso especial que debe tener en cuenta es que cuando Promise.allSettled recibe una matriz vacía como entrada, inmediatamente se resuelve en una matriz vacía. Esto suena lógico y es el comportamiento esperado, pero aún quería señalarlo.

/**
 * A simple dummy function that
 * fetches data from multiple
 * endpoints related to a user.
 */
async function fetchUserData(id){
  // A simple array of promises.
  // The first two parameters are
  // mock calls from down below.
  const promises = [
    fetchUserHistory(id),
    fetchUserProfile(id),
    // For testing only, let's throw.
    Promise.reject(new Error('an error'))
];
  
  const values = await Promise.allSettled(promises);
  // values === [
  //    { status: "fulfilled", value: [1, 2, 3] },
  //    { status: "fulfilled", value: {name:"dummy"} },
  //    { status: "rejected", reason: {}
  // ]
}

// The following functions are just mocks
// and should help improve readability
// of the example at the top.

async function fetchUserHistory(id){
  return Promise.resolve([1,2,3]);
}

async function fetchUserProfile(id){
  return Promise.resolve({ name: "dummy" });
}

Como puede ver, Promise.allSettled es una adición muy agradable a Promise.all y le permite esperar todos los resultados, independientemente de sus resultados. No creo que esta API se ajuste a todos los casos de uso, pero seguro que evita que envuelvas las llamadas asíncronas en un bloque try-catch-block.