3

Ich habe den folgenden Code. Und es funktioniert wie erwartet, ohne einen unbehandelten Ablehnungsfehler zu werfen.Unbehandelte Ablehnung Fehler Bluebird

p = new Promise (fulfill, reject) -> 
    reject new Error 'some error' 

p.catch (error) -> 
    console.log error 

Nun funktioniert das zweite Codebeispiel eine nicht behandelte Ablehnung Fehler werfen. Kann mir jemand erklären, warum das passiert, wenn ich den Fehler klar behandle?

p = new Promise (fulfill, reject) -> 
    reject new Error 'some error' 

p.then -> 
    console.log 'ok' 

p.catch (error) -> 
    console.log error 

Btw. Ich teste in Chrom und drossel v3.4.7

+0

dass Coffeescript ist? Vielleicht das coffeescript-Tag hinzufügen? – dtkaias

+0

Ihr Kaffeescript. habe gerade das Tag hinzugefügt. –

Antwort

1

Per error management configuration Drossel einen Fehler wirft, wenn es kein catch-Handler ist registriert, wenn ein Versprechen abgelehnt wird, ohne darauf zu warten, um zu sehen, wenn man in der Zukunft hinzugefügt wird. Beachten Sie, dass die Überprüfung auf einen Ablehnungshandler asynchron zu dem Thread erfolgen sollte, der die Versprechungskette eingerichtet hat. Wie sie sagen, "einige Programmiermuster werden zu falschen positiven Ergebnissen führen". Ja wirklich?

Auf der anderen Seite sind nicht abgefangene Ausnahmefehler nicht Teil des ES6-Standards, und Implementierungen behandeln sie auf unterschiedliche Weise: Firefox wartet oder warte bis zur GC-Zeit, während Chrome Timeout (oder Zeitüberschreitung) mit ein "möglicher Fehler bei der Ablehnung".

Wenden Sie sich an die Blue Bird-Dokumentation, um mögliche Lösungen für Bluebird zu erhalten.


Aber da beide Beispiele einen ablehnen Handler für Versprechen p, wird der Grund für die Ausnahme an anderer Stelle liegen synchron befestigen.

Dank @DJ's Antwort, aber mit einer anderen Interpretation. Im zweiten Beispiel gibt then eine Zusage zurück, die zurückgewiesen wird, wenn abgelehnt wird, und keinen Ablehnungshandler hat. Das Versprechen von .then ist wahrscheinlich derjenige, der den Fehler wirft.

+0

Diese Antwort erklärt jedoch nicht den Unterschied zwischen den beiden separaten Codeblöcken in der Frage, da beide keinen catch-Handler installiert haben, wenn das Versprechen abgelehnt wird. – jfriend00

+0

@ jfriend00 Ich stimme zu, der erste Teil der Antwort erklärt diesen Fehler nicht. Ich habe den zweiten Teil geklärt. – traktor53

1

Wenn Sie die Kette Promises wird jede Kette als neue Instanz von Versprechen behandelt.

catch() ist ähnlich wie then(), außer Sie nur Handler auf Ablehnung Fall bieten.

Also in Ihrem Beispiel 1: Ihre catch() ist für die Behandlung der Ablehnung der ursprünglichen Versprechen, wo der Fehler erstellt wurde.

In Beispiel 2: Es wird gesagt, wenn das erste Versprechen gelöst ist, gehen Sie bitte zu 2.Versprechen, wo Sie dann Handler auf Erfolg und Misserfolg bereitstellen. Die catch(), die Sie haben, gibt es Fehler in der Funktion innerhalb der then() für die Handhabung, die nicht eins nach dem ersten Versprechen angehoben

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch finden Sie weitere Informationen darüber, wie Fang arbeitet

+0

Aber wenn Sie den Code ausführen, sehen Sie, dass der Fehler in der Konsole protokolliert wird, ebenso wie ein unbehandelter Ablehnungsfehler. Das 'catch()' behandelt also Fehler innerhalb des ersten Versprechens. Scheint das nicht ein bisschen komisch. Warum würde der Fang immer noch ausgeführt, wenn Bluebird sagt, dass der Fehler nicht behandelt wurde? –

Verwandte Themen