Donc, en gros vous demandez quelle est la différence entre ces deux (où p
est une promesse créés à partir de certaines de code précédent):
return p.then(...).catch(...);
et
return p.catch(...).then(...);
Il y a des différences quand p résout ou rejette, mais de savoir si ces différences de matière ou non dépend de ce que le code à l'intérieur de l' .then()
ou .catch()
des gestionnaires.
Ce qui se passe lors de l' p
décide:
Dans le premier schéma, lorsque p
se résout, l' .then()
gestionnaire est appelé. Si c' .then()
gestionnaire renvoie une valeur ou une autre promesse qui décide finalement de, puis l' .catch()
gestionnaire est ignorée. Mais, si l' .then()
gestionnaire soit jetés ou retourne une promesse que finalement rejette, puis l' .catch()
gestionnaire d'exécuter pour la rejeter dans la promesse d'origine p
, mais aussi une erreur qui se produit dans l' .then()
gestionnaire.
Dans le deuxième schéma, lorsque p
se résout, l' .then()
gestionnaire est appelé. Si c' .then()
gestionnaire soit jetés ou retourne une promesse que finalement rejette, puis l' .catch()
gestionnaire ne peut pas l'attraper parce que c'est avant dans la chaîne.
Donc, c'est la différence #1. Si l' .catch()
gestionnaire est APRÈS, alors il peut aussi détecter les erreurs à l'intérieur de l' .then()
gestionnaire.
Ce qui se passe lors de l' p
dénonce:
Maintenant, dans le premier schéma, si la promesse p
rejette, puis l' .then()
gestionnaire est ignorée et l' .catch()
gestionnaire sera appelé comme vous le souhaitez. Ce que vous faites dans l' .catch()
gestionnaire détermine ce qui est retournée comme résultat final. Si vous il suffit de retourner une valeur à partir de l' .catch()
gestionnaire ou le retour d'une promesse qui décide finalement de, alors, la promesse de la chaîne d'interrupteurs à l'état résolu parce que vous "manipulé" l'erreur et retourné normalement. Si vous jeter ou de retour le refus de la promesse dans l' .catch()
gestionnaire, puis le retour de la promesse reste rejeté.
Dans le deuxième schéma, si la promesse p
rejette, puis l' .catch()
gestionnaire est appelé. Si vous retournez une valeur normale ou une promesse qui décide finalement de l' .catch()
gestionnaire (et donc de "manipulation" de l'erreur), alors, la promesse de la chaîne d'interrupteurs à l'état résolu et l' .then()
gestionnaire après l' .catch()
sera appelée.
De sorte que la différence #2. Si l' .catch()
gestionnaire d'AVANT, alors qu'il peut gérer l'erreur et permettre l' .then()
gestionnaire de toujours appelée.
Quand à utiliser:
Utilisez le premier régime si vous voulez juste un .catch()
gestionnaire qui peut attraper des erreurs soit dans la promesse p
ou dans l' .then()
gestionnaire et un rejet de p
devriez sauter .then()
gestionnaire.
Utiliser le deuxième régime si vous voulez être en mesure de repérer les erreurs dans la promesse d'origine p
et peut-être (en fonction des conditions), permettre la promesse de la chaîne de continuer comme résolu, donc l'exécution de l' .then()
gestionnaire.
L'autre option
Il y a une autre option pour utiliser à la fois des rappels que vous pouvez passer à l' .then()
comme dans:
p.then(fn1, fn2)
Cela garantit que seul l'un d' fn1
ou fn2
ne sera jamais appelé. Si p
résolu, alors fn1
sera appelée. Si p
rejette, alors fn2
sera appelée. Pas de changement de résultat en fn1
peut jamais faire l' fn2
appelée ou vice versa. Donc, si vous voulez être absolument sûr que seul l'un de vos deux maîtres-chiens est appelée, peu importe ce qui se passe dans les gestionnaires eux-mêmes, alors vous pouvez utiliser p.then(fn1, fn2)
.