Warum verhalten sich native Promises wie ein Versuch/Haken bei Syntaxfehlern?Warum erfassen Promises Syntaxfehler?
Versprechen haben eindeutig einen Wert in der Flusskontrolle, wenn Sie eine Reihe von asynchronen Operationen in der richtigen Reihenfolge durchführen müssen. Aber die Notwendigkeit, Ihre eigenen unangemessenen Fehler bei der Implementierung von Implementierungen für jedes Versprechen zu implementieren, macht es manchmal schwierig, mit ihnen zu arbeiten.
Nehmen Sie den folgenden Code ein:
asdf
let one = new Promise((resolve, reject) => {
asdf
}).catch(err => {
console.log(err)
console.log(err.stack)
})
Die erste Syntaxfehler erzeugt einen typischen Browser-Fehler und einen Stack-Trace mit 18 Einträgen. Die versprochene Version hat 4.
Also meine Frage ist, warum, wenn Sie die Spezifikation schreiben und nativ implementieren, behielten sie die Try/Catch-ähnliche Funktionalität der Userspace-Implementierung von Versprechen, so dass es für den Fluss verwendet werden konnte Kontrolle, aber lassen Sie die Standardfehlerbehandlung?
Denn das ist kein Syntaxfehler, sondern ein Referenzfehler (möglicherweise) auftritt in der Zukunft. – Bergi
Beachten Sie, dass die Fehler ReferenceErrors und nicht SyntaxErrors sind. Letzteres kann nicht abgefangen werden, da die Engine nicht gut genug versteht, um das Skript auszuführen. Aber 'asdf' ist ein gültiger Bezeichner und der Zugriff auf eine Variable allein ist eine gültige Anweisung. Also, der Parser findet keine Probleme damit. –
Nicht sicher, ob dies ein geeignetes Duplikat ist: [Warum werden Ausnahmen für die Ablehnung von Versprechungen in JS verwendet?] (Http://stackoverflow.com/q/21616432/1048572) Bitte kommentieren Sie, wenn es sich bei Ihrer Frage um einen anderen Punkt handelt. – Bergi