🌐 JavaScript Asynchronität

JS 05: Callbacks, Event Loop & Promises

Meistere nicht-blockierenden Code, den Event Loop und moderne Promises für robuste Web-Anwendungen.

⚡ 1. Synchron vs. Asynchron & Event Loop

JavaScript ist Single-Threaded. Wenn eine Aufgabe Zeit benötigt (z. B. Timer, Netzwerk-Aufrufe, Dateilesen), darf sie den Hauptthread nicht blockieren.

Der Event Loop sorgt dafür, dass asynchrone Callbacks in einer Warteschlange verwaltet und erst ausgeführt werden, wenn der Haupt-Callstack frei ist.

🍔 Die Restaurant-Pieper-Analogie

Bestellst du in einem Restaurant dein Essen, musst du nicht starr an der Kasse stehen bleiben. Du erhältst sofort einen Bestell-Pieper (ein Promise im Zustand pending). Du setzt dich entspannt an deinen Tisch (der Event Loop verarbeitet andere Dinge).

Ist dein Menü fertig, vibriert der Pieper (resolvefulfilled). Brennt die Küche, blinkt er rot (rejectrejected).

📊 2. Das Promise-Zustandsdiagramm

Ein Promise ist ein Stellvertreter-Objekt für einen zukünftigen Wert. Es befindet sich immer in genau einem von drei Zuständen:

⏳ pending
(wartend / schwebend)
resolve(wert)
✅ fulfilled
.then(wert => ...)
reject(error)
❌ rejected
.catch(err => ...)

🛠️ 3. Eigene Promises & Chaining

Ein Promise wird mit new Promise((resolve, reject) => { ... }) erzeugt:

// 1. Promise definieren
function ladeDaten(id) {
  return new Promise((resolve, reject) => {
    if (id > 0) {
      setTimeout(() => resolve({ id: id, status: "ok" }), 100);
    } else {
      reject(new Error("ID muss positiv sein"));
    }
  });
}

// 2. Promise verketten (Chaining)
ladeDaten(42)
  .then(daten => {
    console.log("Geladen:", daten);
    return daten.id * 2;
  })
  .then(verdoppelt => console.log("Verdoppelt:", verdoppelt))
  .catch(err => console.error("Fehler:", err.message))
  .finally(() => console.log("Vorgang abgeschlossen."));

🚀 Parallelisierung mit Promise.all()

// Lädt quelleA und quelleB parallel und wartet auf beide
Promise.all([quelleA, quelleB])
  .then(([resA, resB]) => console.log("Beide fertig:", resA, resB))
  .catch(err => console.error("Mindestens eine Quelle schlug fehl:", err));

🎯 Aufgaben & Checkliste

💡 Lösungstipps & Hilfestellung
  • Nutze return new Promise((resolve, reject) => { ... });.
  • Innerhalb des Executors rufst du resolve(wert) bei Erfolg oder reject(new Error("...")) bei Fehlern auf.
  • Promise.all nimmt ein Array entgegen: Promise.all([quelleA, quelleB]).
💻 In Web-IDE öffnen → Weiter zu Modul 06 →