Pour apprendre Angular 2, j'essaie leur tutoriel.
Je reçois une erreur comme celle-ci:
(node:4796) UnhandledPromiseRejectionWarning: Unhandled promise rejection (r ejection id: 1): Error: spawn cmd ENOENT
[1] (node:4796) DeprecationWarning: Unhandled promise rejections are deprecated.
In the future, promise rejections that are not handled will terminate the Node.
js process with a non-zero exit code.
J'ai parcouru différentes questions et réponses dans SO, mais je n'ai pas pu découvrir ce qu'est un «rejet de promesse non géré».
Quelqu'un peut-il simplement m'expliquer de quoi il s'agit et aussi de quoi il Error: spawn cmd ENOENT
s'agit, quand il survient et ce que je dois vérifier pour me débarrasser de cet avertissement?
javascript
angular
es6-promise
spawn
unhandled-exception
Mohammad Sadiqur Rahman
la source
la source
Réponses:
L'origine de cette erreur réside dans le fait que chaque promesse est censée gérer le rejet de la promesse, c'est-à-dire avoir un .catch (...) . vous pouvez éviter la même chose en ajoutant .catch (...) à une promesse dans le code comme indiqué ci-dessous.
par exemple, la fonction PTest () résoudra ou rejettera une promesse basée sur la valeur d'une variable globale somevar
Dans certains cas, le message "rejet de promesse non géré" apparaît même si nous avons écrit .catch (..) pour les promesses. Tout dépend de la façon dont vous écrivez votre code. Le code suivant générera un "rejet de promesse non géré" même si nous le gérons
catch
.La différence est que vous ne gérez pas
.catch(...)
comme une chaîne mais comme une chaîne séparée. Pour une raison quelconque, le moteur JavaScript le traite comme une promesse sans rejet de promesse non géré.la source
myFunc = myFunct.then...
dans le deuxième exemple.var x = foo(); x = x.then(...); x = x.catch(...)
.then(() => {...})
que vous ne gérez pas ? Je ne pense pas que cela fasse la même chose que lorsque vous les enchaînez. C'est ça?catch
est un sucre de syntaxe pourthen(undefined, onRejected)
. Puisque vous avez déjà appelé alors sur myfunc et que cela a déclenché une erreur, il ne va pas appeler à nouveau (non défini, onRejected) sur la même promesse.C'est quand un
Promise
est terminé avec.reject()
ou une exception a été levée dans unasync
code exécuté et aucun.catch()
n'a géré le rejet.Une promesse rejetée est comme une exception qui se propage vers le point d'entrée de l'application et fait que le gestionnaire d'erreurs racine produit cette sortie.
Voir également
la source
Les promesses peuvent être "traitées" après avoir été rejetées. Autrement dit, on peut appeler le rappel de rejet d'une promesse avant de fournir un gestionnaire de capture. Ce comportement me dérange un peu car on peut écrire ...
... et dans ce cas, la Promesse est rejetée en silence. Si l'on oublie d'ajouter un gestionnaire de capture, le code continuera de s'exécuter silencieusement sans erreur. Cela pourrait conduire à des bogues persistants et difficiles à trouver.
Dans le cas de Node.js, il est question de gérer ces rejets de promesse non gérés et de signaler les problèmes. Cela m'amène à ES7 async / wait. Considérez cet exemple:
Dans l'exemple ci-dessus, supposons que toothPromise a été rejetée (erreur: sans dentifrice!) Avant que getRoomTemperature ne soit remplie. Dans ce cas, il y aurait un rejet de promesse non géré jusqu'à l'attente de toothPromise.
Mon point est le suivant ... si nous considérons les rejets de promesses non gérés comme un problème, les promesses qui sont ensuite traitées par un attente peuvent être signalées par inadvertance comme des bogues. Là encore, si nous considérons que les rejets de promesses non gérés ne sont pas problématiques, les bugs légitimes pourraient ne pas être signalés.
Réflexions là-dessus?
Ceci est lié à la discussion trouvée dans le projet Node.js ici:
Comportement de détection de rejet non géré par défaut
si vous écrivez le code de cette façon:
Lorsque getReadyForBed est invoqué, il créera de manière synchrone la promesse finale (non retournée) - qui aura la même erreur de "rejet non géré" que toute autre promesse (cela pourrait être rien, bien sûr, selon le moteur). (Je trouve très étrange que votre fonction ne retourne rien, ce qui signifie que votre fonction asynchrone produit une promesse non définie.
Si je fais une promesse en ce moment sans problème et que j'en ajoute une plus tard, la plupart des implémentations d '"erreur de rejet non gérée" retireront réellement l'avertissement lorsque je le gérerai plus tard. En d'autres termes, async / wait ne modifie en rien la discussion sur le "rejet non géré".
pour éviter cet écueil, veuillez écrire le code de cette façon:
Notez que cela devrait empêcher tout rejet de promesse non géré.
la source
TLDR: Une promesse a
resolve
etreject
, faire unreject
sans catch pour le gérer est déprécié, vous devrez donc au moins en avoir uncatch
au plus haut niveau.la source
Dans mon cas, Promise ne rejetait ni ne résolvait, car ma fonction Promise lançait une exception. Cette erreur provoque le message UnhandledPromiseRejectionWarning.
la source
Lorsque j'instancie une promesse, je vais générer une fonction asynchrone. Si la fonction se passe bien, j'appelle RESOLVE puis le flux continue dans le gestionnaire RESOLVE, dans THEN. Si la fonction échoue, mettez fin à la fonction en appelant REJECT puis le flux continue dans le CATCH.
Dans NodeJs, le gestionnaire de rejet est obsolète. Votre erreur n'est qu'un avertissement et je l'ai lu dans github node.js. J'ai trouvé ça.
la source