Appearance
Kapitel 11: Asynchrone Programmierung
11.1 Unterschied zwischen synchron und asynchron
- Synchron: Blockierend, Befehle werden nacheinander ausgeführt
- Asynchron: Nicht-blockierend, ermöglicht andere Operationen während des Wartens
11.2 Dart asynchrones Kernstück: Future
Future-Grundlagen
dart
Future<String> holeDaten() {
return Future.delayed(Duration(seconds: 2), () => 'Daten erhalten');
}Future-Status
- Unerledigt: Noch nicht abgeschlossen
- Erfolg: Erfolgreich abgeschlossen
- Fehler: Mit Fehler abgeschlossen
Future-häufige Methoden
dart
void main() {
// then (Erfolg-Callback)
holeDaten().then((daten) {
print(daten);
});
// catchError (Fehler-Callback)
Future.error('Ein Fehler').catchError((fehler) {
print('Fehler: ' + fehler);
});
// whenComplete (immer ausgeführt)
holeDaten()
.then((daten) => print(daten))
.catchError((fehler) => print(fehler))
.whenComplete(() => print('Abgeschlossen'));
}11.3 async/await
async-Schlüsselwort
dart
Future<void> asynchroneFunktion() async {
// Diese Funktion ist asynchron
}await-Schlüsselwort
dart
Future<void> datenVerarbeiten() async {
print('Starte...');
String daten = await holeDaten(); // Wartt auf Abschluss
print('Erhalten: ' + daten);
print('Beendet');
}try-catch (Fehler abfangen)
dart
Future<void> datenHolen() async {
try {
String daten = await holeDaten();
print(daten);
} catch (fehler) {
print('Fehler: ' + fehler.toString());
} finally {
print('Immer ausgeführt');
}
}11.4 Asynchroner Durchlauf
dart
Future<void> warteSchleife() async {
for (int i = 0; i < 5; i++) {
await Future.delayed(Duration(seconds: 1));
print(i);
}
}
void main() async {
await for (int i in Stream.periodic(Duration(seconds: 1), (i) => i).take(5)) {
print(i);
}
}11.5 Praxisbeispiel
dart
// Netzwerkanfrage simulieren
Future<String> simuliereAnfrage(bool erfolg) {
return Future.delayed(Duration(seconds: 2), () {
if (erfolg) {
return '{"status": "erfolg", "daten": [1, 2, 3]}';
} else {
throw 'Netzwerkfehler';
}
});
}
Future<void> appStarten() async {
print('App startet...');
try {
print('Sende Anfrage...');
String antwort = await simuliereAnfrage(true);
print('Antwort erhalten: ' + antwort);
} catch (fehler) {
print('Fehler: ' + fehler.toString());
} finally {
print('Anfrage abgeschlossen');
}
}
void main() {
appStarten();
print('Andere Aufgaben werden ausgeführt...');
}11.6 Häufige Fehler für Anfänger
- await wird am falschen Ort verwendet: Nur in async-Funktionen verwendbar
- Missverständnis über die Ausführungsreihenfolge asynchroner Code: Verstehen Sie die Event-Loop
