Ich habe den folgenden Code in einem Tutorial gefunden:
promise.then(function(result){
//some code
}).catch(function(error) {
throw(error);
});
Ich bin ein bisschen verwirrt: Erreicht der Catch Call etwas? Es scheint mir, dass es keine Wirkung hat, da es einfach den gleichen Fehler auslöst, der abgefangen wurde. Ich stütze mich darauf, wie ein regelmäßiger Versuch / Fang funktioniert.
javascript
promise
Tyler Durden
quelle
quelle
try { ... }catch(error){ throw new Error("something went wrong") }
. Oder um zu zeigen, dass Versprechen und Fehler kompatibel sind (zumindest so) . Aber in seiner aktuellen Implementierung ist es einfach nur dumm. Sie haben Recht, es macht nichts und es ist nicht einmal wie ein Hook, den Sie in OOP hinzufügen würden, um das Überschreiben in einer ererbenden Klasse zu ermöglichen. Ich würde den catch-Block hinzufügen, sobald er etwas tut, aber nicht so, nicht nur als Platzhalter.Antworten:
Es hat keinen Sinn, nackt zu fangen und zu werfen, wie Sie zeigen. Es macht nichts Nützliches außer dem Hinzufügen von Code und der langsamen Ausführung. Wenn Sie also gehen
.catch()
und erneut werfen, sollte es etwas geben, das Sie in der tun möchten.catch()
, andernfalls sollten Sie das einfach.catch()
vollständig entfernen .Der übliche Punkt für diese allgemeine Struktur ist, wenn Sie etwas ausführen möchten,
.catch()
z. B. den Fehler protokollieren oder einen Status bereinigen möchten ( z. B. Dateien schließen), die Versprechen-Kette jedoch als abgelehnt fortgesetzt werden soll.In einem Tutorial kann es nur dazu dienen, Personen zu zeigen, wo sie Fehler abfangen können, oder das Konzept des Umgangs mit dem Fehler zu lehren und ihn dann erneut zu werfen.
Einige der nützlichen Gründe für das Fangen und Umwerfen sind folgende:
Ein einfaches Abfangen und erneutes Auslösen desselben Fehlers ohne anderen Code im catch-Handler ist jedoch für die normale Ausführung des Codes nicht hilfreich.
quelle
throw new Exception(periousException);
nicht wissen, ob Javascript verschachtelte Fehler unterstützt, aber trotzdem ist "log and throw" eine schlechte Praxis..catch()
Fehler in den Haken zu werfen, es sei denn, Sie tun etwas anderes in der.catch()
. Darum geht es bei dieser Antwort..finally()
kann dafür sehr nützlich sein, aber manchmal werden die Ressourcen bereits im fehlerfreien Pfad gepflegt, sodass Sie sie.catch()
immer noch schließen können. Es kommt wirklich auf die Situation an.Beide
.then()
und.catch()
Methoden geben Versprechen zurück. Wenn Sie in einem der beiden Handler eine Ausnahme auslösen, wird das zurückgegebene Versprechen abgelehnt und die Ausnahme wird im nächsten Ablehnungshandler abgefangen.Im folgenden Code lösen wir im ersten eine Ausnahme aus
.catch()
, die im zweiten abgefangen wird.catch()
:Der zweite
.catch()
gibt ein Versprechen zurück, das erfüllt ist. Der.then()
Handler kann aufgerufen werden:Nützliche Referenz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Chaining_after_a_catch
Hoffe das hilft!
quelle
Es gibt keinen wichtigen Unterschied, wenn Sie den
catch
Methodenaufruf vollständig weglassen.Das einzige, was hinzugefügt wird, ist eine zusätzliche Mikrotask, was in der Praxis bedeutet, dass Sie die Ablehnung des Versprechens später bemerken als dies bei einem Versprechen der Fall ist, das ohne die
catch
Klausel fehlschlägt .Das nächste Snippet zeigt dies:
Beachten Sie, wie die zweite Ablehnung vor der ersten gemeldet wird. Das ist ungefähr der einzige Unterschied.
quelle
Ihre Frage lautet also: "Was macht die
.catch()
Methode in der Versprechenskette ?"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw
Die throw-Anweisung "stoppt (die Anweisungen nach dem throw werden nicht ausgeführt) und die Steuerung wird an den ersten catch-Block im Aufrufstapel übergeben. Wenn unter den Aufruferfunktionen kein catch-Block vorhanden ist, wird das Programm beendet."
In der Versprechenskette gibt die
.then()
Methode eine Art Datenblock zurück. Diese Rückgabe des Stücks wird das Versprechen vervollständigen. Die erfolgreiche Rückgabe der Daten vervollständigt das Versprechen. Sie können sich die.catch()
Methode genauso vorstellen..catch()
Es werden jedoch erfolglose Datenabrufe verarbeitet. Die throw-Anweisung vervollständigt das Versprechen. Gelegentlich werden Sie Entwickler sehen,.catch((err) => {console.log(err))}
die auch die Versprechenskette vervollständigen.quelle
Sie müssen es tatsächlich nicht erneut werfen. Lassen Sie Promise.catch einfach leer, da es sonst als nicht behandelt betrachtet wird, und verpacken Sie den Code in einen Try-Catch. Der Fehler wird automatisch abgefangen.
quelle