Eine Promise beschreibt eine Aufgabe, die später erfolgreich sein oder fehlschlagen kann. Ein Aufruf wie fetch liefert zunächst eine Promise statt direkt die Daten. async macht eine Funktion asynchron. await wartet innerhalb dieser Funktion auf ein Ergebnis. Das ist noch keine Garantie für parallele CPU-Verarbeitung.
01Eine verzögerte Aufgabe starten
setTimeout plant eine spätere Ausführung. Die Promise löst sich danach mit dem Namen auf. Unser Beispiel arbeitet ohne Netzwerk, damit du den Ablauf unabhängig von einem Server beobachten kannst.
function loadName() {
return new Promise((resolve) => {
setTimeout(() => resolve('House'), 100);
});
}
try {
const name = await loadName();
console.log(name);
} catch (error) {
console.error('Loading failed:', error.message);
}
Starten / prüfen
node async.mjs02Das Ergebnis verwenden
await loadName() liefert House nach der Verzögerung. Ohne await hättest du die Promise selbst. Während einer echten Netzwerkaufgabe kann die Oberfläche weiter reagieren. Eine später fertig werdende alte Anfrage darf aber nicht automatisch eine neuere Anzeige überschreiben.
03Den Fehlerweg ausprobieren
Ersetze resolve("House") durch reject(new Error("Unavailable")) und ergänze reject als zweiten Parameter des Promise-Callbacks. catch empfängt den Fehler. finally wäre ein Ort für Aufräumen, das bei Erfolg und Fehler nötig ist.
Nach etwa 100 Millisekunden: House
Deine Übung
Starte zwei unabhängige loadName-Aufrufe mit Promise.all. Wie sieht das Ergebnis aus?
Lösung mit Erklärung anzeigen
const names = await Promise.all([loadName(), loadName()]) ergibt ["House", "House"]. Die Reihenfolge folgt den Eingaben. Wenn eine Aufgabe fehlschlägt, lehnt Promise.all ab. Die andere Aufgabe wird dadurch nicht automatisch abgebrochen.
Projektbezug und Quellen
Das Beispiel ist zum Lernen vereinfacht. Die verlinkte Codeversion zeigt die Anwendung im Projekt und die dortigen Prüfungen.