Choses importantes à comprendre ici
Les fonctions then
et catch
renvoient de nouveaux objets de promesse.
Le fait de lancer ou de rejeter explicitement fera passer la promesse actuelle à l'état rejeté.
Depuis then
et catch
renvoyer de nouveaux objets de promesse, ils peuvent être enchaînés.
Si vous lancez ou rejetez dans un gestionnaire de promesses ( then
ou catch
), il sera traité dans le prochain gestionnaire de rejet sur le chemin de chaînage.
Comme mentionné par jfriend00, les gestionnaires then
et catch
ne 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 do1
en lançant un Error
objet. Désormais, la promesse actuelle sera rejetée et le contrôle sera transféré au gestionnaire suivant, ce qui est then
dans notre cas.
Puisque le then
gestionnaire n'a pas de gestionnaire de rejet, le do2
ne sera pas exécuté du tout. Vous pouvez le confirmer en utilisant à l' console.log
inté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 catch
c'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 Error
objet à partir de celui-ci, donc la promesse renvoyée par catch
sera é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 catch
gestionnaire 1, vous obtenez la valeur de l' promise
objet comme rejeté.
De la même manière, la promesse retournée par le catch
gestionnaire 1 est également rejetée avec la même erreur avec laquelle le a promise
été rejeté et nous l'observons dans le second catch
gestionnaire.
.catch(…)
revient.