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

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

Barbara Streisand
Libérer: 2024-12-25 22:15:13
original
483 Les gens l'ont consulté

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

Quand .then(success, fail) est-il considéré comme un anti-modèle pour les promesses ?

La FAQ sur les promesses de Bluebird suggère que l'utilisation de .then(success, fail) est un anti-modèle. En effet, les appels .then() renvoient une promesse qui sera rejetée si le rappel renvoie une erreur. Par conséquent, lorsque le rappel success logger échoue, l'erreur est transmise au rappel .catch() suivant, mais pas au rappel d'échec fourni avec le rappel de succès.

Flux de contrôle Diagramme :

[Image des diagrammes de flux de contrôle pour then avec deux arguments, puis catch chaîne]

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

// 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

Justification du modèle :

Habituellement, des erreurs sont détectées à chaque étape de le traitement et la gestion des erreurs sont centralisés afin que toutes les erreurs soient traitées par un seul gestionnaire final. Cependant, le modèle mentionné dans l'anti-modèle est utile lorsque :

  • Les erreurs doivent être traitées spécifiquement dans une étape donnée.
  • Si aucune erreur ne se produit, l'action ultérieure est sensiblement différente.

Ce modèle peut introduire des branchements dans le contrôle flow.

Modèle recommandé :

Au lieu de répéter le rappel, 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

Vous pouvez également envisager d'utiliser .finally().

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