EMZETT.
Login

async/await

Kurz: async/await ist eine Schreibweise für asynchronen Code, die sich wie normaler, sequenzieller Code liest: await wartet auf das Ergebnis einer langsamen Operation, ohne den restlichen Programmablauf zu blockieren.

Genauer: Eine als async markierte Funktion gibt ein Versprechen zurück (Promise, Future, Task). Mit await hält sie an dieser Stelle an und gibt die Kontrolle ab, bis das Ergebnis da ist – andere Aufgaben laufen in der Zwischenzeit. Das ist bequemer als verschachtelte Callbacks. Unterstützt wird es in JavaScript/TypeScript, Python, C#, Kotlin (Coroutinen), Rust, Swift, Dart und weiteren.

Im Detail

async function ladeBenutzer(id) {
  const antwort = await fetch(`/api/benutzer/${id}`);
  if (!antwort.ok) throw new Error("Fehler " + antwort.status);
  return antwort.json();
}
 
async function zeige() {
  try {
    const [a, b] = await Promise.all([ladeBenutzer(1), ladeBenutzer(2)]);  // parallel
    console.log(a.name, b.name);
  } catch (e) {
    console.error(e.message);
  }
}
import asyncio
 
async def hole(n):
    await asyncio.sleep(1)          # simuliert Warten auf das Netzwerk
    return n * 2
 
async def main():
    ergebnisse = await asyncio.gather(hole(1), hole(2), hole(3))   # ~1 Sekunde, nicht 3
    print(ergebnisse)
 
asyncio.run(main())

Nebenläufig, nicht parallel

async/await läuft meist auf einem Thread: Während eine Aufgabe wartet, kommt eine andere an die Reihe (kooperatives Multitasking, gesteuert von einer Event Loop). Das eignet sich hervorragend für Ein-/Ausgabe (Netzwerk, Dateien, Datenbank), aber nicht für schwere Berechnungen – die belegen den Thread und blockieren alles; dafür nimmt man Threads oder Prozesse.

Fehlerbehandlung

Fehler werden mit try/catch (Exceptions) behandelt wie in synchronem Code. Wichtig: ein vergessenes await liefert ein Versprechen statt des Ergebnisses; unbehandelte abgelehnte Versprechen sind eine häufige Fehlerquelle.

Siehe auch: Event Loop, Callback, Nebenläufigkeit, Thread