Mit Ecma-Script8 (ES8) haben wir eine Möglichkeit, Code, der asynchron ist, lesbarer zu schreiben und der sogenannten "Callback-Hell" zu entkommen: Die Rettung lautet Async / Await. Um Async / Await verstehen zu können, müssen wir jedoch zuerst Promises verstehen. Wir nutzen diese Techniken, um den asynchronen Code, der sequentiell in Javascript ausgeführt wird, wie bspw. API-Aufrufe von Drittanbietern, mühsame I/O-Operationen und andere CPU-intensive/blockierende Aufgaben, zu verarbeiten.
Um den Code cleaner zu schreiben und damit lesbarer zu machen gibt es Promises.
Ein Promise ist ein Objekt, das synchron von einer asynchronen Funktion zurückgegeben werden kann.
Das Promise befindet sich in einem von drei möglichen Zuständen:
Behoben (resolved): Ein Promise konnte erfolgreich Daten abrufen oder einen Wert abrufen.
Abgelehnt (rejected): Ein Promise konnte aufgrund eines Fehlers oder Problems keine Daten abrufen.
Ausstehend (pending): Ausgangszustand, noch nicht gelöst oder abgelehnt.
In diesem Zuge arbeiten wir mit .then und .catch. Das .then wird dann verkettet, um bei Erfolg eine Funktion auszuführen, und ein .catch wird hinzugefügt, um eine Fehlerbehandlung bereitzustellen.
Wenn wir in einer Funktion "return new Promise((resolve, reject) => {" einbringen, gibt uns dies ein Promise zurück. Ein Promise-Konstruktor übernimmt eine Funktion, die zwei Parameter akzeptiert: Reject und Resolve.
Async-Await ist eine weitere Möglichkeit, Promises in JavaScript zu handhaben. Sie vereinfachen die Anwendung von Promises, sind allerdings kein vollständiger Ersatz für Promises. Sie ermöglichen die kollektive Verarbeitung einer Gruppe von Promises.
Das Schlüsselwort async kann so "async function test()"" oder so "const test = async() =>{}"" platziert werden. Die Verwendung des Wortes async vor einer Funktion bedeutet, dass diese Funktion ein Promise zurückgibt. Die von dieser Funktion zurückgegebenen Werte werden automatisch in ein aufgelöstes Promise eingeschlossen. Wenn wir das Keyword "async" vor der Funktionsdefinition verwenden, können wir innerhalb der Funktion auch "await" verwenden.
Await kann nur innerhalb einer asynchronen Funktion verwendet werden. Wir können Async ohne Await verwenden, aber wir können Await nicht ohne Async verwenden.
Await weist die JS-Engine an, zu warten, seine Aktivitäten zu unterbrechen, bis das von der asynchronen Funktion zurückgegebene Promise abgelehnt oder aufgelöst wird. Erst dann kann das nächste await verarbeitet werden. Await-Aufrufe laufen also immer nacheinander.
Übrigens: Wir können jedem einzelnen Await ein catch() hinzufügen, da es sich um ein ganz normales Promise handelt.