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
DDDoriginal
2024-12-31 16:45:09172parcourir

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);

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);
   });

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!

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