🌐 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 (resolve → fulfilled). Brennt die Küche, blinkt er rot (reject → rejected).

📊 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 →