Maison >interface Web >js tutoriel >Avons-nous besoin de Promise.allSettled() ?

Avons-nous besoin de Promise.allSettled() ?

DDD
DDDoriginal
2024-11-30 16:47:14711parcourir

Do we need Promise.allSettled()?

Que pensez-vous de Promise.allSettled() ?

Pour moi, allSettled ressemble à une solution à la recherche d'un problème. Ce problème est que les développeurs ne gèrent pas les erreurs.

Le concept

Promise.allSettled() a un design très simple :

const allSettled = (promises) => Promise.all(promises.map(entry => entry
  .then((value) => ({ status: 'fulfilled', value }))
  .catch((reason) => ({ status: 'rejected', reason }))
));

Il fournit un objet de résultat "cohérent" - eh bien, le statut est cohérent, vous pouvez donc .filter() plus proprement que d'utiliser Object.hasOwn(), mais la valeur et la raison sont intentionnellement différentes, vous ne pouvez donc pas les mélanger.

La plupart du temps, allSettled ajoute un .catch() à chaque promesse pour vous.

Gérez vos erreurs

Mais voici mon point de friction : si vous appelez un groupe de services en parallèle et que vous savez qu'un ou plusieurs peuvent échouer, mais cela n'a pas vraiment d'importance... pourquoi n'écrivez-vous pas de gestion des erreurs pour cela ?

const getFlakyService = (payload) => fetch(flakyUrl, payload);

Promise.allSettled([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((outcomes) => outcomes
  .filter(({ status }) => status === 'fulfilled'))
});

Combien d'efforts économisons-nous par rapport à cela :

const getFlakyService = (payload) => fetch(flakyUrl, payload)
  // We don't really care about the failures
  .catch(() => undefined);

Promise.all([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((data) => { /* ... */ });

Si vous vous souciez des appels qui échouent, vous avez probablement besoin des informations de demande accessibles pour le suivi, dont la disponibilité n'est pas garantie dans le motif. Promise.allSettled est encore moins utile dans ce cas et il est plus logique d'écrire votre propre gestion des erreurs.

const getFlakyService = (payload) => fetch(flakyUrl, payload)
  // Send the failures details to a tracking/logging layer
  .catch((error) => trackRequestError(flakyUrl, payload, error);

Promise.all([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((data) => { /* ... */ });

J'admets que la standardisation du « résultat » pourrait être pratique. Avec allSettled, vous pouvez compter les échecs une fois qu’ils sont tous terminés. Mais cela est également vrai avec la gestion personnalisée des erreurs.

Conclusion

Je continuerai à utiliser Promise.all() dans un avenir proche, mais je suis curieux de connaître vos cas d'utilisation de Promise.allSettled() et pourquoi vous le préférez.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn