Zum Inhalt springen

Aufgabe 05 - Promise-Werkstatt

Zu Zen-Modus wechseln

Sie bauen mit Promises und async/await eine simulierte Pizzeria-Küche: asynchrone Abläufe mit Abhängigkeiten, Wartezeiten und Fehlerfällen (siehe Kapitel Nebenläufigkeit I). Die Simulation ist bewusst greifbar gewählt; dieselben Muster tragen später jeden API-Aufruf.

  • Kapitel Nebenläufigkeit I vollständig; Aufgabe 04 (Event-Loop-Modell).
  • Node.js mit TypeScript (tsx), VS Code.
  • Sie erzeugen eigene Promises mit resolve/reject und typisieren sie mit Promise<T>.
  • Sie koordinieren abhängige Abläufe mit async/await und behandeln Fehler mit try/catch.
  • Sie vergleichen then-Ketten und async/await begründet.
  • Reproduktion: die Grundbausteine (sleep, einfache async-Funktionen) nach Vorlage erstellen (Teil A).
  • Reorganisation und Transfer: die Bausteine zu einem fehlerbehandelten Ablauf kombinieren (Teile B und C).
  • Reflexion, Problemlösung und Urteilsbildung: Fehlverhalten vorhersagen, nachweisen und mit dem Ausführungsmodell erklären (Teil D).

Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.

  1. sleep(milliseconds): Promise<void>: löst nach der Wartezeit auf (mit setTimeout gebaut; der Klassiker aus dem Kapitel).
  2. Drei Küchenschritte als typisierte async-Funktionen: makeDough() (2 s), addToppings(dough, topping) (1 s), bake(pizza) (3 s). Jede loggt Start und Ende mit Zeitstempel und reicht ein beschreibendes Objekt weiter ({ step: "dough", topping?: ... }).
  3. bake schlägt in 25 Prozent der Fälle fehl: throw new Error("burned!") (bzw. reject). Der Zufall kommt aus Math.random().
  1. orderPizza(topping): führt die drei Schritte mit await in der richtigen Reihenfolge aus und misst die Gesamtdauer mit performance.now().
  2. Verbrannt-Behandlung: Beim ersten Fehlschlag wird genau einmal neu gebacken; scheitert auch das, wird der Fehler weitergereicht (nicht verschluckt).
  3. Der Aufrufer (ein kleines Hauptprogramm) fängt den Fehler und meldet kundenfreundlich; ein finally druckt in jedem Fall die Dauer.
  1. Schreiben Sie dieselbe Kette ein zweites Mal als then-Verkettung mit einem catch am Ende (Funktionsname orderPizzaThen).
  2. Vergleichen Sie beide Fassungen in zwei bis drei Sätzen: Lesbarkeit, Fehlerbehandlung, wo würden Sie welche einsetzen?
  1. Vorhersage zuerst, schriftlich: Was passiert, wenn in orderPizza das await vor bake(...) fehlt? Was wird geloggt, was liefert die Funktion, wann erscheint ein eventueller Verbrannt-Fehler?
  2. Probieren Sie es aus und vergleichen Sie mit Ihrer Vorhersage. Erklären Sie das beobachtete Verhalten mit dem Event-Loop-Modell aus Aufgabe 04 (wo liegt das Promise, wann läuft sein Code?).
  3. Zeigen Sie, wie TypeScript hilft: Welche Compile-Meldung entsteht, wenn der Rückgabewert von bake ohne await weiterverarbeitet wird?
  4. Bauen Sie abschließend orderPizza so um, dass zwei Beläge parallel vorbereitet werden (zweimal addToppings gleichzeitig, gemeinsames Warten), und messen Sie den Zeitgewinn. Hinweis: Das Koordinationswerkzeug dafür kennt das Kapitel; die Vertiefung folgt in Aufgabe 07.
  1. In welchen drei Zuständen kann ein Promise sein, und wie oft wechselt es?
  2. Was liefert eine async-Funktion immer, auch bei return 42?
  3. Wohin springt die Ausführung, wenn ein awaitetes Promise scheitert?
  4. Warum pausiert await nur die Funktion und nicht das Programm?
  5. Woran erkennen Sie im Log, dass zwei Schritte parallel statt nacheinander liefen?

pizzeria.ts mit beiden Varianten, den Messwerten und den schriftlichen Antworten (Vorhersage und Erklärung aus Teil D) als Kommentar.