Maison >interface Web >js tutoriel >Quand « alors (succès, échec) » est-il un anti-modèle pour les promesses ?
La syntaxe .then(succès, échec) dans les promesses peut être considérée comme un anti-modèle dans certains cas. Explorons les raisons et comparons-la avec l'approche .then().catch().
.then(success, fail) renvoie une promesse qui rejette si la fonction de rappel renvoie une erreur. Ainsi, si l'enregistreur de réussite échoue, l'erreur sera transmise au gestionnaire .catch() suivant, et non au rappel d'échec.
Dans le scénario suivant, en utilisant .then( success, fail) devient problématique :
some_promise_call() .then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Si la fonction de journalisation des succès échoue, l'erreur ne sera pas détectée par le rappel d'échec, mais par le prochain gestionnaire .catch() de la chaîne. Cela peut perturber la logique de gestion des erreurs prévue.
Au lieu de cela, l'approche recommandée consiste à utiliser .then() et .catch() séparément :
some_promise_call() .then(function(res) { logger.log(res) }) .catch(function(err) { logger.log(err) })
Dans ce cas, le gestionnaire .catch() détectera également toutes les erreurs générées par la fonction de journalisation des succès. Cela garantit que toutes les erreurs sont traitées de manière cohérente.
Bien que la syntaxe .then().catch() offre une meilleure gestion des erreurs, la syntaxe .then(success, fail) antipattern peut être utile dans les situations où vous souhaitez :
Cependant, il est important de se rappeler que ce modèle introduit des ramifications dans le flux de contrôle, ce qui peut ne pas être souhaitable. dans certaines circonstances.
Au lieu de .then(succès, échec), le .done() ou Les méthodes .finally() peuvent être utilisées pour gérer les achèvements ou les erreurs de manière cohérente.
// Handle errors and completion together some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); }); // Handle completion always, regardless of errors some_promise_call() .finally(function() { logger.log('Promise completed'); });
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!