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
Barbara Streisandoriginal
2024-12-25 22:15:13543parcourir

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

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

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!

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