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
Libérer: 2024-12-16 12:36:12
original
338 Les gens l'ont consulté

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
Copier après la connexion

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" }));
Copier après la connexion

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");
});
Copier après la connexion

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 }
});
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal