Dart Future

In diesem Blog habe ich das Thema Future schon einmal gestreift. Das ist aber schon eine Weile her. Zeit, es noch einmal zu tun. Führen wir uns als erstes noch einmal vor Augen, was ein Future genau ist.

Future


Nehmen wir an wir wollen ein File von der Festplatte laden. Das kann ein kleines File sein, was schnell geht, oder ein großes. Beim großen File kann das dauern, bis wir mit dem File weiter arbeiten können. Oder wir greifen auf das Web zu und laden von dort Daten. Je nach Internetverbindung, nach gösse der Daten, dauert auch dies unterschiedlich lang. In beiden Fällen müssen wir also warten, bis wir das File oder die Daten aus dem Internet geladen haben.

Dieses Schaubild verdeutlicht die Problematik sehr gut. Der schwarze Balken repräsentiert unseren Programm Ablauf, von Oben nach unten. Im asynchronen Ablauf wartet die Software die Antwort ab, in unserem Fall bis zum Beispiel das File geladen ist. Im asynchronen Ablauf, wird direkt nach dem "auslösen" des File ladens, der zweite Request (hole Daten aus dem Web) ausgelöst. Im asynchronen Ablauf werden wir von beiden Requests die wir ausgelöst haben, Antworten bekommen. Im Erfolgsfall, aber auch wenn ein Fehler auftritt. In der Programmiersprache Dart kommt hier der Future bzw die Futures zum Einsatz. Im meinem ersten Teil zu diesem Thema hatten wir ja schon ein kleines Beispiel, hier das nächste:
Im Beispiel importieren wir zwei Dart Bibliotheken und holen ein Textfile von der Festplatte, welches wir anschließend drucken.

meinFileInhalt.then(.....)

Beim Resultat wenden wir dann die .then Methode an, um das File auszudrucken, im Beispiel ein Textfile. Hier ist wichtig zu verstehen: Ein Future retourniert immer sofort ein Ergebnis, ein Future Objekt. Dieses wird einmal das Ergebnis enthalten, das gewünschte, oder einen Fehler. Mit der .then Methode implementieren wir, was mit dem Ergebnis geschieht. Der Code wird ausgeführt, wenn das Ergebnis da ist. Solange das Ergebnis nicht da ist, wird Dart mit der Programmausführung fortfahren, beginnend mit dem ersten Befehl nach .then !

Wir haben im Code meinFile.readAsString() benutzt. Diese Funktion retourniert ein Objekt vom Typ Future<String>. Wir werden in Dart ab und zu auf Funktionen treffen, die es sowohl asynchron, als auch  synchron gibt. Beispiel: .readAsString() // .readAsStringSync().  Nun zu einem Beispiel das wir selbst erstellen:

Im Code wird zuerst eine Funktion vom Typ Future<String> erstellt. Sie nimmt als Argumente eine Zeichenkette. Nach einer Verzögerung, .delayed, retourniert sie diesen String. Man beachte hier: Wir haben zwei ! return Statements. Den Code kann man so übersetzen: Retourniere ein verzögertes Future Objekt, sobald die Verzögerung abgeschlossen ist. Die Verzögerung löst bei Abschluss eine .then Methode aus, welche eine Zeichenkette zurückgibt. Diese wird dann mit dem ersten return an den aufrufenden Code zurückgegeben. Da der Rückgabe Wert der Funktion ein Future ist, kann das Ergebnis anschließend mit .then in die Konsole gedruckt werden.
Wenn man diesen Code ausdruckt, wird man die Verzögerung sehen. Im letzten Code für diesen Post, habe ich noch eine Print Funktion hinzu gefügt. Bei der Ausführung sieht man das asynchrone an diesem Code sehr gut.

Das Schaubild stammt aus einem Artikel von Medium: Zu dem geht es hier lang ! Er befasst sich zwar mit Python, aber der Teil der asynchron / synchrone erklärt ist allgemein gültig.

Kommentare

Beliebte Posts aus diesem Blog

Material Design in Flutter Teil 2

Dart Basic: Listen Part 1

Listen in Dart (2021): Part 1 List.filled List.empty und List.add