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.
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.
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]
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); }
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.
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.
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!