Async/Await – Fehlerbehandlung, Generatoren

Posted by in JavaScript

Im letzten Blog ging es um Die Grundlagen von Async/Await. Dieser Teil behandelt die Fehlerbehandlung, Probleme die es bei der Verwendung von Async/Await geben könnte und der Basisfunktionalität, ohne die es gar nicht möglich wäre Async/Await in dieser Form bereitzustellen.

Fehlerbehandlung

Die Fehlerbehandlung mit Async/Await kann man erheblich vereinfachen, indem try/catch-Blöcke verwendet werden. Das geht dann wie im folgenden Code

Dafür muss jedoch die Funktion getInspiration2 geändert werden. Dort muss beim Reject des Promises das error-Objekt zurückgegeben werden.

Vorteil dieser Implementierung ist, dass Fehler sinnvoll abgefangen werden können und nicht in irgendeinem Reject-Handler behandelt werden.

Probleme

Wie bereits angesprochen, werden Fehler normalerweise einfach verschluckt. Das ist einerseits ganz ok so. Dann wird der then-Teil des Codes, der auf die Erfüllung des Promises wartet, eben nicht ausgeführt. Andererseits würde ich als Entwickler doch gerne eine Fehlermeldung oder ein Logging bevorzugen. Dazu ist Disziplin notwendig, indem konsequent der Fehler weitergegeben wird und im try/catch der async-Funktion eine Behandlung stattfindet.

Generatoren

Generatoren sind neben Promises eine Grundlage von Async/Await. Sie zeichnen sich dadurch aus, dass die Funktionsausführung gestoppt werden kann. Das ganze passiert mit dem Schlüsselwort yield. Zuerst definieren wir eine Generatorfunktion dumbGenerator.

Anschließend lässt sich durch einen Aufruf der Funktion ein Generatorobjekt erzeugen. Mit next lässt sich immer wieder bis zum nächsten yield weiter rücken. Oder wie im folgenden Code mit for…of (for…of – Erklärung bei Mozilla) nacheinander alle Werte abfragen. Das geht deswegen, da ein Generator auch ein Iterable ist.

Mit etwas Fantasie kann erahnt werden, auf was das Ganze hinausläuft. Mit einer Hilfsfunktion runGenerator (Quelle: runGenerator function) kann ein Async/Await gebaut werden.

Dieser wird eine Generatorfunktion übergeben, die Promises „yielded“.

Wie funktioniert das jetzt? Wer will kann sich im Code vertiefen 😉 Wer nicht will: Es wird asynchron über den Iterator gegangen und jedesmal, wenn ein Promise resolved wird next() auf dem Iterator aufgerufen und die nächste asynchrone Funtion gestartet. Und schon ist es fertig. Das selbst gebaute Async/Await-Feature. Wer mehr darüber wissen will, dem sei der oben genannte Link ans Herz gelegt.

Fazit

Async/Await macht asynchrone Programmierung für Menschen verständlich. Das Error-Handling ist mit try/catch möglich. Ansonsten werden Fehler ganz still und heimlich verschluckt. Grundlage des ganzen sind Generatoren in Verbindung mit Promises. Zum Glück wird die Komplexität durch Async/Await versteckt, was die Arbeit mit asynchronem Code vereinfacht.