Rolf B: Promises: .then() reagiert anders als async await! :O

Beitrag lesen

Hallo Ferdinand,

meine Theorie ist: Du hast das alte Promise-Konzept, das vor der Einführung des async/await Zuckergusses bestand, nicht richtig verstanden.

Bei "klassischen" Promises verwendest Du kein try/catch, oder höchstens deshalb, um Fehler beim Konstruieren des Promise-Netzes abzufangen. Die eigentliche Verarbeitung findet in den then- und catch-Callbacks der Promises statt, und denen entkommt keine Exception.

Eine Exception in den Callbacks des Promise-Systems (Exekutoren, then- und catch-Callbacks) führen zu einem rejected Promise, und ein rejected Promise fängt man mit .catch() oder mit dem zweiten Parameter von .then ab. Eine JavaScript-Exception fliegt nie.

Der async/await Syntaxzucker sieht zur Behandlung von rejected Promises keine eigene Syntax vor. Deswegen musst Du bei await ein try/catch Konstrukt nutzen, um einen reject zu behandeln.

Also entweder so:

promiseSomething() 
.then(result => /* use result */)
.catch(err => (handle error */)

oder so

promiseSomething() 
.then(result => /* use result */, err => /* handle error */)

oder so

try {
   let result = await promiseSomething() 
   /* use result */
}
catch (err) {
   /* handle error */
}

Wobei diese drei Konstrukte nicht 100% gleichwertig sind. Nr. 1 und Nr. 3 laufen bei einer Exception im Promise-Generator UND bei einer Exception in der result-Verarbeitung in den catch. Die Nr. 2 behandelt nur einen Reject bzw. Error aus dem Executor.

Eine Exception im catch würden alle 3 als uncaught error liefern.

Ich bin längst nicht fertig mit dem Artikel, aber hier steht schon einiges darüber.

Rolf

--
sumpsi - posui - obstruxi