/* Page prose (de) */
"VersionBModern" = "# Version B (modern): `async`/`await` + `async let`\n\nDieselbe Aufgabe. Jeder Abruf ist nun eine **asynchrone Funktion**, die\nentweder einen Wert zurückgibt oder `throws`. Wir starten beide mit **`async\nlet`**, damit sie nebenläufig laufen, machen `await` auf beide zusammen,\nkombinieren und lassen `@MainActor` uns auf den Hauptthread bringen, ohne\nmanuellen Sprung.";
"VersionBModern-2" = "**Sieh es laufen:** identische Ausgabe:\n\n* callout(Ausgabe):\n`Fetching menu and stock...`  \n`Sellable today: [\"Latte\", \"Espresso\"]`\n\nUnd das Timing ist ebenfalls identisch (beide laufen weiterhin parallel, ~0,6 s\ninsgesamt). Die Playground-Seite läuft weiter, während die `Task` sich\nvervollständigt.\n\n* callout(Probier es aus): Erhöhe den Sleep von `fetchMenu` auf\n`.milliseconds(1200)`: die Gesamtzeit folgt dem *langsamsten* Abruf, nicht der\nSumme beider. Welche Zeile wird immer noch zuerst ausgegeben?\n\nSchau nun, was verschwunden ist:\n\n* **Keine gemeinsam genutzten veränderlichen Variablen.** `menu` und `stock`\nsind einfach Werte.\n* **Kein `enter`/`leave`.** `async let` startet jedes Kind; `try await (menu,\nstock)` ist die Verbindung. Es gibt keinen Zähler auszugleichen.\n* **Ein Fehlerpfad.** Wenn entweder `fetchMenu` oder `fetchStock` wirft, landet\ndas im einzigen `catch`. Du hast keine zwei Optionals ausgepackt, und du hast\nnicht `.get()` aufgerufen.\n* **Kein manueller Sprung auf den Hauptthread.** `@MainActor` an der Funktion\n*ist* die Garantie. Das Kombinieren und das `print` laufen auf dem Main Actor,\nweil die Funktion darauf isoliert ist. Zu vergessen, zum Hauptthread\nzurückzukehren, ist nicht mehr möglich.\n\nDie Logik, das `filter`, ist nun die auffälligste Zeile in der Funktion, weil\nalles um sie herum aus dem Weg ging.\n\n---\n\n## Spür den Unterschied\n\n* **Gemeinsam genutzter veränderlicher Zustand.** Klassisch: zwei\n`Result?`-Variablen. Modern: keine.\n* **\"Auf beide warten.\"** Klassisch: `DispatchGroup` mit `enter`/`leave`.\nModern: `async let` mit `await`.\n* **Fehlerbehandlung.** Klassisch: Optionals auspacken, dann `try`/`catch`.\nModern: ein `try`/`catch`.\n* **Lieferung auf dem Hauptthread.** Klassisch: an `notify(queue: .main)`\ngedacht. Modern: `@MainActor`, automatisch.\n* **Zeilen, die nicht die eigentliche Aufgabe sind.** Klassisch: viele. Modern:\nwenige.\n* **Compiler erwischt einen verpassten Hauptthread-Sprung.** Klassisch: nein.\nModern: ja.\n\nGleiches Verhalten, gleiche Parallelität, gleiche Ausgabe, aber B sagt, was es\n*bedeutet*, und lässt den Compiler die Teile durchsetzen, die du früher im Kopf\nbehalten musstest. Das ist das ganze Argument für das moderne Modell in einem\nBeispiel.\n\n[Zurück](@previous)  |  Seite 4 von 8  |  [Weiter: Klassisch und modern in der Praxis](@next)";
