Skip to content

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

Frei für alle Anfänger