Maison >interface Web >js tutoriel >Pourquoi « .then(success, fail) » est-il considéré comme un anti-modèle dans la gestion des promesses ?

Pourquoi « .then(success, fail) » est-il considéré comme un anti-modèle dans la gestion des promesses ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-25 18:42:14769parcourir

Why is `.then(success, fail)` Considered an Anti-pattern in Promise Handling?

Inconvénients de l'utilisation de .then(succès, échec) pour la gestion des promesses

Question :

Dans la documentation Bluebird Promise, .then(succès, fail) est étiqueté comme un anti-modèle. Quelle est la raison derrière cela ?

Réponse :

Contrairement au chaînage .then(success).catch(fail) recommandé, l'utilisation de .then(success, fail) pose un problème de flux de contrôle :

  • S'il y a une erreur dans le rappel de réussite, elle est propagée au prochain gestionnaire .catch(), ignorer efficacement le rappel d'échec.

Comparaison des flux de contrôle :

Utilisation de .then (succès, échec) :

try {
    results = some_call();
} catch (e) {
    logger.log(e);
    break then;
} else
    logger.log(results);

Utilisation .then(success).catch(fail) :

try {
    var results = some_call();
    logger.log(results);
} catch (e) {
    logger.log(e);
}

Raison d'être :

L'anti-modèle est déconseillé car il limite la gestion des erreurs à un seul gestionnaire de capture final. Cependant, cela peut être utile dans les scénarios où :

  • Vous souhaitez gérer les erreurs dans une étape de rappel spécifique.
  • Vous avez besoin d'une gestion différente pour les cas d'erreur et de non-erreur (en branchant le flux de contrôle).

Raffinement :

Pour éviter de répéter les rappels, vous pouvez utiliser ce qui suit pattern :

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

Vous pouvez également utiliser la méthode .finally() à cet effet.

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