Web Development

Ein Lehrbuch für das Informatik oder Medien-Informatik Studium.

Sie kennen nun Promises und then() als Art mit Asynchronität umzugehen.

Nun lernen wir eine zweite Schreibweise für Promises.

await statt then

Bei der Verwendung von await braucht man keine Callback-Funktionen oder Arrow-Funktionen mehr - der Code sieht wieder aus wie synchroner Code:

Html Code await

<script type="module">
  const response = await fetch("counter.php");
  const counter = await response.text();
  let p = document.createElement("p");
  p.innerHTML = `Zugriffe auf diese Seite: <b>${counter}</b>`;
  document.querySelector("body").appendChild(p);
</script>

Was bedeutet await?

Das keyword await wird auf eine promise angewandt:

Javascript Code await

  const promise = fetch("counter_ajax.php");
  const response = await promise;

await wartet nicht aktiv auf das Ergebnis. Stattdessen wird die Ausführung des aktuellen Javascript Programmes an dieser Stelle pausiert, und in der Zwischenzeit kann anderer JavaScript-Code ausgeführt werden.

Wenn der andere Code fertig ausgeführt ist, und das Ergebnis der Promise verfügbar ist, läuft das pausierte Programm weiter und übernimmt den Rückgabewert.

Das bedeutet: Die Aussage: “Ein Javascript Programm wird nie unterbrochen”. stimmt so nicht mehr. An jeder Stelle mit await kann die Ausführung unterbrochen werden – und in der Zeit kann ein anderes JavaScript-Programm laufen.

async await und Fehlerbehandlung.

Bei Promises mussten wir die .catch Methode ans Ende der .then Chain anhängen um einen Fehler abzufangen.

Mit async/await können wir wieder die “normale” try catch Schreibweise verwenden:

Javascript Code await mit Fehlerbehandlung

try {
  const response = await fetch("counter.php");
  const counter = await response.text();
  let p = document.createElement("p");
  p.innerHTML = `Zugriffe auf diese Seite: <b>${counter}</b>`;
  document.querySelector("body").appendChild(p);
} catch (error) {
  console.error("Fehler beim Laden des Zählers:", error);
}

Await und Reihenfolge

Mit await ist nun die Reihenfolge, in der die Befehle ausgeführt werden, wieder wie erwartet

Demo

Warnhinweis

Im Browser kann man await direkt im Hauptteil eines JavaScript-Moduls verwenden. Innerhalb einer Funktion funktioniert await aber nur, wenn die Funktion mit dem Schlüsselwort async markiert ist

Javascript Code asynchrone funktion

async function f1() {
  console.log("ich kann await");
}
function f2() {
  console.log("ich kann kein async und kein await");
}

Auch anonyme Funktionen und Arrow Functions können async sein:

Javascript Code asynchrone arrow function

const f1 = async () => {
  console.log("ich kann await");
}
const f2 = () => {
  console.log("ich kann kein async und kein await");
}

Beispiel: DOMContentLoaded

document.addEventListener('DOMContentLoaded', async () => {
  const response = await fetch("counter.php");
});

Siehe auch