Maison >interface Web >js tutoriel >Comment puis-je gérer toutes les promesses, y compris celles rejetées, en JavaScript asynchrone ?

Comment puis-je gérer toutes les promesses, y compris celles rejetées, en JavaScript asynchrone ?

DDD
DDDoriginal
2024-12-16 12:36:12337parcourir

How Can I Handle All Promises, Including Rejected Ones, in Asynchronous JavaScript?

Attendre que toutes les promesses se réalisent, malgré les rejets

Dans la programmation asynchrone, gérer les promesses peut présenter des défis lorsque certaines tâches échouent. Considérons le scénario suivant :

const arr = [fetch('index.html'), fetch('http://does-not-exist')];

Promise.all(arr)
  .then(res => console.log('success', res))
  .catch(err => console.log('error', err)); // This is executed

Le code ci-dessus effectue des requêtes réseau à l'aide de fetch. Cependant, comme Promise.all rejettera dès la première requête ayant échoué, nous rencontrons un problème : comment pouvons-nous gérer les résultats de toutes les tâches, même celles qui ont échoué ?

Solution JavaScript native

Pour pour résoudre ce problème, nous pouvons utiliser les techniques JavaScript natives suivantes :

  1. Utiliser Reflect pour créer un wrapper Promesse :
const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));

Cette fonction de réflexion renvoie une nouvelle promesse qui se résout en un objet contenant soit la valeur résolue, soit le motif du rejet, ainsi qu'une propriété d'état indiquant l'état de la promesse.

  1. Appliquer Reflect à tous Promesses :
var arr = [fetch('index.html'), fetch('http://does-not-exist')];

Promise.all(arr.map(reflect)).then(function(results){
  var success = results.filter(x => x.status === "fulfilled");
});

Dans cet exemple, nous appliquons la réflexion à chaque promesse du tableau. Le tableau résultant contient désormais un objet avec des propriétés d'état et d'erreur ou de valeur pour chaque requête.

Alternative moderne : Promise.allSettled

Pour une solution moderne, envisagez d'utiliser le Promise.allSettled intégré :

Promise.allSettled([promise]).then(([result]) => {
  // Code will execute regardless of the promise's state
  // { status: "fulfilled", value: 33 }
});

Cette méthode constitue un moyen pratique de gérer toutes les promesses réglées, quel que soit leur résultat.

Par en tirant parti de ces techniques, vous pouvez gérer gracieusement les opérations asynchrones et accéder aux résultats de toutes les promesses, même celles qui échouent, vous permettant de prendre des décisions éclairées basées sur les données disponibles.

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