Maison > interface Web > js tutoriel > Pourquoi « .then(success, fail) » est-il un anti-modèle dans les promesses JavaScript ?

Pourquoi « .then(success, fail) » est-il un anti-modèle dans les promesses JavaScript ?

DDD
Libérer: 2024-12-31 16:45:09
original
186 Les gens l'ont consulté

Why is `.then(success, fail)` an Antipattern in JavaScript Promises?

Anti-modèle : .then(succès, échec) dans les promesses

L'argument pour éviter .then(succès, échec)

La FAQ sur la promesse Bluebird déconseille d'utiliser .then(success, fail) comme anti-modèle. Bien que les blocs try-catch puissent sembler analogues, il existe des différences :

Différences de flux de contrôle :

.then(success, fail) renvoie une promesse qui sera rejetée si le rappel de réussite renvoie une erreur. Cela signifie que si l'enregistreur de réussite échoue, l'erreur sera transmise au rappel .catch(), et non au rappel d'échec.

Diagrammes de flux de contrôle :

[ Puis avec deux arguments](https://i.sstatic.net/WAcpP.png)

[Then-catch chaîne](https://i.sstatic.net/wX5mr.png)

Équivalent synchrone :

// then: { try ... catch(e) { ... } else ... }
try { var results = some_call(); } catch(e) { logger.log(e); break then; } // else logger.log(results);
Copier après la connexion

Gestion des exceptions :

Le logger .catch() gérera également les exceptions de l'appel du success logger, offrant une gestion des erreurs plus complète. mécanisme.

Anticiper l'utilité de l'anti-modèle

Bien que l'anti-modèle soit généralement déconseillé, il peut être utile lorsque :

  • Vous souhaitez gérer erreurs spécifiques à une étape du traitement.
  • Vous souhaitez entreprendre des actions différentes selon qu'une erreur s'est produit.

Attention : Soyez conscient que cette approche introduit des branchements dans le flux de contrôle.

Alternative à .then(succès, échec)

Pour éviter la duplication de code, pensez à utiliser .catch et .done :

some_promise_call()
   .catch(function(e) {
       return e; // it's OK, we'll just log it
   })
   .done(function(res) {
       logger.log(res);
   });
Copier après la connexion

Ou vous pouvez opter pour .finally() pour gérer à la fois les scénarios de réussite et d'échec.

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