Maison >interface Web >js tutoriel >Quand l'utilisation de « .then(success, fail) » est-elle un anti-modèle dans les promesses ?

Quand l'utilisation de « .then(success, fail) » est-elle un anti-modèle dans les promesses ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-28 18:36:13847parcourir

When is Using `.then(success, fail)` an Antipattern in Promises?

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

Dans la FAQ Bluebird Promise, .then(succès, échec) est signalé comme anti-modèle. Cela peut prêter à confusion, surtout si vous ne comprenez pas l'explication concernant les instructions try et catch.

Quel est le problème avec .then(success, fail) ?

L'appel .then() renvoie une promesse qui est rejetée si le rappel renvoie une erreur. Cela signifie que si l'enregistreur de réussite échoue, l'erreur sera transmise au rappel .catch() suivant, et non au rappel d'échec accompagnant le succès.

Diagramme de flux de contrôle

Le flux de contrôle pour .then avec deux arguments et une chaîne .then-catch est illustré ci-dessous :

[Image des diagrammes de flux de contrôle pour .then et .then-catch chain]

Équivalent au code synchrone

Pour exprimer cela en code synchrone :

// some_promise_call().then(logger.log, logger.log)
then: {
    try {
        var results = some_call();
    } catch(e) {
        logger.log(e);
        break then;
    } // else
        logger.log(results);
}

.then(success) vs. .then().catch()

Comparez cela avec :

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

Dans ce cas, l'enregistreur catch gère les exceptions du appel de l'enregistreur de réussite.

quand .then(success, fail) est-il un anti-modèle ?

L'argument contre ce modèle est que vous devez généralement détecter les erreurs à chaque étape de traitement et éviter de l'utiliser dans des chaînes . On s'attend à ce que vous n'ayez qu'un seul gestionnaire final pour toutes les erreurs.

Cependant, ce modèle est utile pour gérer des erreurs spécifiques dans une étape particulière et pour entreprendre une action différente si aucune erreur ne se produit. Sachez que cela bifurque votre flux de contrôle.

Exemple d'antimodèle amélioré

Considérez ce qui suit :

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 .finally() à cette fin.

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