Quand est .ensuite(réussite, échec) considéré comme un antipattern pour des promesses?
J'ai eu un coup d'oeil à la bluebird promesse FAQ, dans lequel il mentionne que .ensuite(réussite, échec)
est un antipattern. Je n'ai pas très bien compris son explication pour le try et catch.
Quel est le problème avec ce la suite?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
Il semble que l'exemple est ce qui suggère ce qui suit comme correctement façon.
some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })
Quelle est la différence?
then().catch()
est plus lisible, que vous n'avez pas besoin de la recherche pour la virgule et enquêter sur ce rappel de la réussite ou de l'échec de la branche.- Il y a beaucoup de différence, cochez les réponses
- dévastée par les regards de meilleur argument. Totalement faux!
- si vous voyez "regarde mieux"?. Merci de lire la réponse suivante et ce qui est plus lisible
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
ou.then(function(res) { logger.log(res) }).catch( function(err) { logger.log(err) })
- REMARQUE: Lorsque vous utilisez
.catch
, vous ne savez pas quelle étape est la cause du problème - à l'intérieur de la dernièrethen
ou quelque part d'autre jusqu'à la promesse de la chaîne. Donc, il possède son propre désavantage. - J'ai toujours ajouter des noms de fonction à la promesse .alors() params pour le rendre lisible, c'est à dire
some_promise_call() .then(function fulfilled(res) { logger.log(res) }, function rejected(err) { logger.log(err) })
Vous devez vous connecter pour publier un commentaire.
La
.then()
appel renvoie une promesse qui sera rejetée dans le cas où la fonction de rappel renvoie une erreur. Cela signifie que, lorsque votre succèslogger
échoue, l'erreur serait passé à la suite de.catch()
de rappel, mais pas à lafail
rappel qui va de pair avecsuccess
.Voici un flux de contrôle diagramme:
De l'exprimer dans le code synchrone:
La deuxième
log
(qui est comme le premier argument de.then()
) seront exécutées uniquement dans le cas où aucune exception s'est produite. L'étiquette de bloc et lesbreak
déclaration sentir un peu bizarre, c'est effectivement ce que python aessayez-sauf-else
pour (lecture recommandée!).La
catch
enregistreur permettra également de gérer les exceptions de la réussite enregistreur d'appel.Tellement la différence.
L'argument est que, en général, vous voulez rattraper les erreurs à chaque étape du traitement, et que vous ne devriez pas l'utiliser dans les chaînes. L'espoir est que vous n'avez qu'une finale gestionnaire qui s'occupe de toutes les erreurs - tout, lorsque vous utilisez le "antipattern", des erreurs dans certains de les rappels ne sont pas traitées.
Cependant, ce modèle est en fait très utile: Quand vous voulez pour gérer les erreurs qui s'est passé exactement de cette étape, et vous voulez faire quelque chose entièrement différentes lorsque aucune erreur ne s'est passé - c'est à dire lorsque l'erreur est irrécupérable. Être conscient que c'est ramification votre flux de contrôle. Bien sûr, c'est parfois souhaitée.
Que vous avez dû vous répéter votre rappel. Vous avez plutôt envie
Vous aussi pourriez envisager d'utiliser
.enfin()
pour cela..catch
sera capture des erreurs à l'intérieur même de la réussite de la fonction.. Personnellement, je trouve cela extrêmement mal que vous vous retrouvez avec une erreur de point d'entrée, ce qui peut arriver de multiples erreurs de multiples actions, mais c'est mon problème. De toute façon - merci pour l'info! Vous n'avez rien outil de communication en ligne que vous êtes prêt à partager, donc je peux demander à quelques choses de plus? 😛Promise
mécanicien sur ce site..done()
ne fait pas partie de la norme, est-il? Au moins MDN n'a pas de liste de cette méthode. Il serait utile.done
est un Bluebird chose qui, fondamentalement, est désapprouvée parthen
+non-rejet de détection.Les deux ne sont pas tout à fait identique. La différence est que le premier exemple de ne pas attraper une exception est levée dans votre
success
gestionnaire. Donc, si votre méthode ne doit jamais revenir résolu promesses, comme c'est souvent le cas, vous avez besoin d'un suiveurcatch
gestionnaire (ou encore un autrethen
avec un videsuccess
paramètre). Bien sûr, il se peut que votrethen
gestionnaire ne rien faire qui pourrait potentiellement l'échec, l'utilisation d'un 2-paramètrethen
pourrait être bien.Mais je crois que le point de le texte vous-même liée à cette
then
est surtout utile contre les rappels dans sa capacité à enchaîner un tas de asynchrone étapes, et en fait, quand vous faites cela, le 2-paramètre de forme dethen
subtilement ne se comportent pas tout à fait comme prévu, pour la raison invoquée ci-dessus. Il est particulièrement contre-intuitif quand utilisé du milieu de la chaîne.Comme quelqu'un qui a fait beaucoup de complexes async trucs et tombé dans les coins comme cela que j'ai à l'admettre, je vous recommande vraiment d'éviter cet anti-modèle et aller avec le gestionnaire d'approche.
En regardant les avantages et les inconvénients de les deux, nous pouvons faire un calcul de prédiction de ce qui est approprié pour la situation.
Ce sont les deux principales approches pour la mise en œuvre de promesses. Les deux ont il est des plus et des moins
Avantages
Inconvénients
Avantages
Disavantages
catch
si vous souhaitez gestionnaire d'erreurs lancé par le succès de rappelSimple à expliquer:
Dans ES2018
qui signifie:
est égal à
À l'aide de
.then().catch()
vous permet d'activer Promesse de Chaînage qui est nécessaire à l'exécution d'un flux de travail. Vous pourriez en avoir besoin de certaines informations de base de données, alors vous voulez passer à une API asynchrone alors vous voulez manipuler la réponse. Vous pouvez pousser la réponse dans la base de données. La manipulation de tous ces flux de travail avec votre concept, c'est faisable mais très dur à gérer. La meilleure solution serathen().then().then().then().catch()
qui reçoit toutes les erreurs en une seule fois attraper et vous permet de garder la maintenabilité du code.À l'aide de
then()
etcatch()
aide de la chaîne de la réussite et de l'échec de gestionnaire de la promesse.catch()
travaux sur la promesse retourné parthen()
. Il gère,(Rappel d'échec sur
then()
ne gère pas cela.)1. let promiseRef: Promise = this. aTimetakingTask (false);
2. promiseRef
3. .then(
4. (result) => {
5. /* successfully, resolved promise.
6. Work on data here */
7. },
8. (error) => console.log(error)
9. )
10. .catch( (e) => {
11. /* successfully, resolved promise.
12. Work on data here */
13. });
Cela fait du sens parce que la promesse retourné par
then()
n'a pas une erreur si un rappel est de prendre soin d'elle.catch
de rappel semble erroné.À la place des mots, le bon exemple. Code suivant (si la première promesse résolu):
est identique à:
Mais avec rejetée en première promesse, ce n'est pas identique: