Détectez les erreurs dans Promise.all

Une alternative sûre à Promise.all de Javascript

En attente de toutes les promesses y compris les erreurs

Si vous êtes un développeur Javascript, vous avez probablement utilisé l'objet intégré standard Promise et son API Promise.all, qui attend jusqu'à ce que toutes les promesses fournies dans un tableau soient résolues. C'est une manière très élégante d'attendre divers résultats asynchrones avant de poursuivre votre logique métier.

Mais cette API ne gère pas les erreurs. Chaque fois qu'au moins une erreur se produit dans le tableau de promesses, la fonction s'arrête immédiatement et aucun autre résultat n'est attendu.

Promise.allSettled attend tous les résultats asynchrones

Heureusement, il existe une deuxième API appelée Promise.allSettled qui garantit d'attendre toutes les promesses, peu importe si le résultat est valide ou une erreur. Le code suivant montre son utilisation, qui est très simple, mais peut vous éviter bien des maux de tête.

La principale différence avec Promise.all est que chaque promesse est résolue en un tuple d'informations, où l'état (réalisé ou rejeté) ainsi que la valeur (en cas de réalisation) ou la raison (en cas de rejet) sont disponibles. .

Fournir un tableau vide

Un cas particulier dont vous devez être conscient est que lorsque Promise.allSettled reçoit un tableau vide en entrée, il se transforme immédiatement en un tableau vide. Cela semble logique et correspond au comportement attendu, mais je voulais quand même le souligner.

/**
 * 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" });
}

Comme vous pouvez le voir, Promise.allSettled est un très bon ajout à Promise.all et vous permet d'attendre tous les résultats, indépendamment de leurs résultats. Je ne pense pas que cette API conviendra à tous les cas d'utilisation, mais elle vous évite certainement d'encapsuler les appels asynchrones dans un bloc try-catch-overhead.