Quelle est la différence?
L' .then()
appel renverra une promesse qui sera rejetée au cas où le rappel génère une erreur. Cela signifie que lorsque votre succès logger
échoue, l'erreur sera transmise au .catch()
rappel suivant , mais pas au fail
rappel associé à success
.
Voici un diagramme de flux de contrôle :
Pour l'exprimer 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);
}
Le second log
(qui est comme le premier argument .then()
) ne sera exécuté que dans le cas où aucune exception ne se produirait. Le bloc étiqueté et l' break
instruction semblent un peu bizarres, c'est en fait ce que Python a try-except-else
pour (lecture recommandée!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
L' catch
enregistreur gérera également les exceptions de l'appel de l'enregistreur de succès.
Voilà pour la différence.
Je ne comprends pas tout à fait son explication quant au try and catch
L'argument est que vous souhaitez généralement détecter les erreurs à chaque étape du traitement et que vous ne devez pas l'utiliser en chaîne. On s'attend à ce que vous n'ayez qu'un seul gestionnaire final qui gère toutes les erreurs - alors que, lorsque vous utilisez le "antipattern", les erreurs dans certains des rappels ne sont pas gérées.
Cependant, ce modèle est en fait très utile: lorsque vous voulez gérer des erreurs qui se sont produites exactement à cette étape, et que vous voulez faire quelque chose de complètement différent quand aucune erreur ne s'est produite - c'est-à-dire lorsque l'erreur est irrécupérable. Sachez que cela branche votre flux de contrôle. Bien sûr, cela est parfois souhaité.
Quel est le problème avec ce qui suit?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Que vous deviez répéter votre rappel. Tu veux plutôt
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()
pour cela.
then().catch()
est plus lisible, car vous n'avez pas besoin de rechercher une virgule et d'enquêter sur ce rappel pour réussir ou échouer la branche.