Maison >interface Web >js tutoriel >Quand « alors (succès, échec) » est-il un anti-modèle pour les promesses ?

Quand « alors (succès, échec) » est-il un anti-modèle pour les promesses ?

DDD
DDDoriginal
2024-12-22 06:07:12565parcourir

When is `then(success, fail)` an Antipattern for Promises?

Quand .then(succès, échec) est-il considéré comme un anti-modèle pour les promesses ?

La syntaxe .then(succès, échec) dans les promesses peut être considérée comme un anti-modèle dans certains cas. Explorons les raisons et comparons-la avec l'approche .then().catch().

Différences de flux de contrôle

.then(success, fail) renvoie une promesse qui rejette si la fonction de rappel renvoie une erreur. Ainsi, si l'enregistreur de réussite échoue, l'erreur sera transmise au gestionnaire .catch() suivant, et non au rappel d'échec.

Scénario anti-modèle

Dans le scénario suivant, en utilisant .then( success, fail) devient problématique :

some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })

Si la fonction de journalisation des succès échoue, l'erreur ne sera pas détectée par le rappel d'échec, mais par le prochain gestionnaire .catch() de la chaîne. Cela peut perturber la logique de gestion des erreurs prévue.

Préférez .then().catch()

Au lieu de cela, l'approche recommandée consiste à utiliser .then() et .catch() séparément :

some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })

Dans ce cas, le gestionnaire .catch() détectera également toutes les erreurs générées par la fonction de journalisation des succès. Cela garantit que toutes les erreurs sont traitées de manière cohérente.

Intention de gestion des exceptions

Bien que la syntaxe .then().catch() offre une meilleure gestion des erreurs, la syntaxe .then(success, fail) antipattern peut être utile dans les situations où vous souhaitez :

  • Gérer les erreurs spécifiquement dans un étape.
  • Effectuer différentes actions selon qu'une erreur s'est produite ou non.

Cependant, il est important de se rappeler que ce modèle introduit des ramifications dans le flux de contrôle, ce qui peut ne pas être souhaitable. dans certaines circonstances.

Options alternatives

Au lieu de .then(succès, échec), le .done() ou Les méthodes .finally() peuvent être utilisées pour gérer les achèvements ou les erreurs de manière cohérente.

// Handle errors and completion together
some_promise_call()
   .catch(function(e) {
       return e; // it's OK, we'll just log it
   })
   .done(function(res) {
       logger.log(res);
   });

// Handle completion always, regardless of errors
some_promise_call()
   .finally(function() {
       logger.log('Promise completed');
   });

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