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
Libérer: 2024-12-28 18:36:13
original
844 Les gens l'ont consulté

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);
}
Copier après la connexion

.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);
}
Copier après la connexion

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);
   });
Copier après la connexion

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal