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 :
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!