wake-up-neo.com

Promise reject () gibt die Warnung "Uncaught (in promise)" aus

Sobald ein Versprechen reject() Rückruf aufgerufen wird, erscheint eine Warnmeldung "Ungefangene (in Versprechen)" in der Chrome= Konsole. Ich kann Wickle meinen Kopf nicht um den Grund dahinter, noch wie ich ihn loswerden kann.

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))

Warnung:

enter image description here

Bearbeiten:

Ich fand heraus, dass JS automatisch einen impliziten Handler bereitstellt, wenn der Handler onRejected nicht explizit für die Methode .then(onResolved, onRejected) bereitgestellt wird. Es sieht so aus: (err) => throw err. Der automatisch generierte Handler wirft seinerseits.

Referenz:

Wenn IsCallable ( onRejected) ` false ist, dann
Sei onRejected " Werfer ".

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

32
Yevgeny Kozlov

Dies liegt daran, dass Sie dem Versprechen, das von der ersten then -Methode zurückgegeben wurde, keinen Catch-Handler hinzufügen. Daher ist dieser Handler nicht vorhanden, wenn das Versprechen abgelehnt wird. Sie haben eine für das Versprechen p in der letzten Zeile, aber nicht für das angekettete Versprechen, das von der Methode then in der Zeile davor zurückgegeben wird.

Wie Sie in den Kommentaren unten richtig hinzugefügt haben, wird der Fehler Standard wird ausgelöst angezeigt, wenn kein Catch-Handler bereitgestellt wird (oder keine Funktion). Innerhalb einer Versprechenskette kann dieser Fehler mit einem Methodenrückruf von catch auf der ganzen Linie abgefangen werden. Wenn jedoch keiner vorhanden ist, wird die JavaScript-Engine den Fehler wie jeden anderen nicht abgefangenen Fehler behandeln und den Standardhandler in anwenden Solche Umstände führen zu der Ausgabe, die Sie in der Konsole sehen.

Um dies zu vermeiden, verketten Sie das .catch Methode zum Versprechen, das vom ersten then zurückgegeben wurde, wie folgt:

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

Selbst wenn Sie Promises richtig verwenden: p.then(p1).catch(p2) können Sie immer noch eine nicht erfasste Ausnahme erhalten, wenn Ihre p2-Funktion schließlich eine Ausnahme auslöst, die Sie mit einem Mechanismus wie window.onerror abfangen möchten. Der Grund dafür ist, dass der Stapel durch die im Versprechen durchgeführte Fehlerbehandlung bereits abgewickelt wurde. Um dies zu beheben, stellen Sie sicher, dass Ihr Fehlercode (der von der Zurückweisungsfunktion aufgerufen wird) keine Ausnahme auslöst. Es sollte einfach zurückkehren.

Es wäre schön, wenn der Fehlerbehandlungscode erkennen könnte, dass der Stapel bereits abgewickelt wurde (sodass Ihr Fehleraufruf für diesen Fall kein Flag haben muss), und wenn jemand weiß, wie dies einfach zu tun ist, werde ich diese Antwort bearbeiten diese Erklärung aufzunehmen.

0
David Spector