Choses importantes à comprendre ici
Les fonctions thenet catchrenvoient de nouveaux objets de promesse.
Le fait de lancer ou de rejeter explicitement fera passer la promesse actuelle à l'état rejeté.
Depuis thenet catchrenvoyer de nouveaux objets de promesse, ils peuvent être enchaînés.
Si vous lancez ou rejetez dans un gestionnaire de promesses ( thenou catch), il sera traité dans le prochain gestionnaire de rejet sur le chemin de chaînage.
Comme mentionné par jfriend00, les gestionnaires thenet catchne sont pas exécutés de manière synchrone. Quand un handler lance, cela prendra fin immédiatement. Ainsi, la pile sera déroulée et l'exception serait perdue. C'est pourquoi lancer une exception rejette la promesse actuelle.
Dans votre cas, vous rejetez à l'intérieur do1en lançant un Errorobjet. Désormais, la promesse actuelle sera rejetée et le contrôle sera transféré au gestionnaire suivant, ce qui est thendans notre cas.
Puisque le thengestionnaire n'a pas de gestionnaire de rejet, le do2ne sera pas exécuté du tout. Vous pouvez le confirmer en utilisant à l' console.logintérieur. Étant donné que la promesse actuelle n'a pas de gestionnaire de rejet, elle sera également rejetée avec la valeur de rejet de la promesse précédente et le contrôle sera transféré au gestionnaire suivant qui est catch.
Comme catchc'est un gestionnaire de rejet, lorsque vous le faites à l' console.log(err.stack);intérieur, vous pouvez voir la trace de la pile d'erreurs. Maintenant, vous lancez un Errorobjet à partir de celui-ci, donc la promesse renvoyée par catchsera également dans un état rejeté.
Puisque vous n'avez attaché aucun gestionnaire de rejet au catch, vous ne pouvez pas observer le rejet.
Vous pouvez diviser la chaîne et mieux comprendre cela, comme ça
var promise = do1().then(do2);
var promise1 = promise.catch(function (err) {
console.log("Promise", promise);
throw err;
});
promise1.catch(function (err) {
console.log("Promise1", promise1);
});
La sortie que vous obtiendrez sera quelque chose comme
Promise Promise { <rejected> [Error: do1] }
Promise1 Promise { <rejected> [Error: do1] }
Dans le catchgestionnaire 1, vous obtenez la valeur de l' promiseobjet comme rejeté.
De la même manière, la promesse retournée par le catchgestionnaire 1 est également rejetée avec la même erreur avec laquelle le a promiseété rejeté et nous l'observons dans le second catchgestionnaire.
.catch(…)revient.