web-dev-qa-db-fra.com

La promesse rejette () provoque l'avertissement "Uncaught (in promise)"

Une fois qu'une promesse reject() callback est appelée, un message d'avertissement "Uncaught (in promesse)" apparaît dans la console Chrome. Je peux Ne comprenez pas la raison derrière cela, ni comment vous en débarrasser.

var p = new Promise((resolve, reject) => {
  setTimeout(() => {
    var isItFulfilled = false
    isItFulfilled ? resolve('!Resolved') : reject('!Rejected')
  }, 1000)  
})

p.then(result => console.log(result))
p.catch(error => console.log(error))

Attention:

enter image description here

Modifier:

J'ai découvert que si le gestionnaire onRejected n'est pas explicitement fourni à la méthode .then(onResolved, onRejected), JS en fournira automatiquement une implicite. Cela ressemble à ceci: (err) => throw err. Le gestionnaire généré automatiquement lancera à son tour.

Référence:

Si IsCallable ( onRejected) `est false , alors
Soit onRejected être " Lanceur ".

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-performpromisethen

32
Yevgeny Kozlov

Cela se produit car vous n'attachez pas de gestionnaire d'interception à la promesse retournée par la première méthode then, qui est donc sans gestionnaire pour le moment où la promesse est rejetée. Vous avez un pour la promesse p à la dernière ligne, mais pas pour le chaîné promesse, retournée par la méthode then, dans la ligne la précédant.

Comme vous l'avez correctement ajouté dans les commentaires ci-dessous, lorsqu'un gestionnaire de capture n'est pas fourni (ou que ce n'est pas une fonction), le par défaut, jettera l'erreur. Dans une chaîne de promesses, cette erreur peut être détectée sur toute la ligne avec un rappel de méthode catch, mais si aucune n’est présente, le moteur JavaScript traitera l’erreur comme toute autre erreur non interceptée et appliquera le gestionnaire par défaut dans De telles circonstances entraînent la sortie affichée dans la console.

Pour éviter cela, enchaînez le .catch méthode de la promesse retournée par le premier then, comme ceci:

p.then( result =>  console.log('Fulfilled'))
 .catch( error =>  console.log(error) );
30
trincot

Même si vous utilisez correctement Promises: p.then(p1).catch(p2), vous pouvez toujours obtenir une exception non capturée si votre fonction p2 lève une exception que vous souhaitez capturer à l'aide d'un mécanisme tel que window.onerror. La raison en est que la pile a déjà été déroulée par la gestion des erreurs effectuée dans la promesse. Pour résoudre ce problème, assurez-vous que votre code d'erreur (appelé par la fonction de rejet) ne génère pas d'exception. Il devrait simplement revenir.

Ce serait bien si le code de gestion des erreurs pouvait détecter que la pile avait déjà été déroulée (votre appel d'erreur ne doit pas nécessairement avoir d'indicateur), et si quelqu'un sait comment le faire facilement, je modifierai cette réponse d'inclure cette explication.

0
David Spector