Die async- und await - Ansätze in Dart sind anderen Sprachen sehr ähnlich, was es für diejenigen, die dieses Muster schon einmal verwendet haben, zu einem bequemen Thema macht. Aber selbst wenn Sie keine Erfahrung mit asynchroner Programmierung mit async/await haben, sollten Sie es leicht finden, hier mitzumachen. 

Async-Funktionen:

Funktionen bilden die Grundlage der asynchronen Programmierung. Diese asynchronen Funktionen haben asynchrone Modifikatoren in ihrem Körper. Hier ist ein Beispiel für eine allgemeine asynchrone Funktion unten:

Wenn eine asynchrone Funktion aufgerufen wird, wird sofort ein Future zurückgegeben und der Hauptteil der Funktion wird später ausgeführt. Während der Hauptteil der asynchronen Funktion ausgeführt wird, wird das vom Funktionsaufruf zurückgegebene Future zusammen mit seinem Ergebnis vervollständigt. Im obigen Beispiel führt der Aufruf von demo() zum Future. 

Allen Funktionen, die Sie asynchron ausführen möchten, muss der async-Modifizierer hinzugefügt werden. Dieser Modifikator kommt wie folgt direkt nach der Funktionssignatur:

Dart

void hello() async {
  print('something exciting is going to happen here...');
}

Normalerweise enthält die Funktion, die Sie asynchron ausführen möchten, einige teure Vorgänge wie Datei-I/O (einen API-Aufruf an einen RESTful-Dienst).

Erwarte Ausdrücke:

Await-Ausdrücke lassen Sie den asynchronen Code fast so schreiben, als wäre er synchron. Im Allgemeinen hat ein Erwartungsausdruck die folgende Form:

Dart

void main() async {
  await hello();
  print('all done');
}

Typischerweise handelt es sich um eine asynchrone Berechnung, und es wird erwartet, dass sie zu einem Future ausgewertet wird. Die await-Ausdrücke werten die main-Funktion aus und setzen dann die aktuell laufende Funktion aus, bis das Ergebnis fertig ist – das heißt, bis Future abgeschlossen ist. Das Ergebnis des await-Ausdrucks ist die Vervollständigung von Future.

  • Es gibt zwei wichtige Dinge, die Sie in Bezug auf den obigen Codeblock verstehen sollten. Zunächst verwenden wir den async-Modifikator für die main-Methode, da wir die hello()-Funktion asynchron ausführen werden.
  • Zweitens platzieren wir den await-Modifikator direkt vor unserer asynchronen Funktion. Daher wird dies häufig als das Asynchron/Warten-Muster bezeichnet.
  • Denken Sie daran, wenn Sie await verwenden, stellen Sie sicher, dass sowohl die aufrufende Funktion als auch alle Funktionen, die Sie innerhalb dieser Funktion aufrufen, alle den async - Modifikator verwenden.

Futures:

Dart ist eine Singlethread-Programmiersprache. Future<T>-Objekt stellt das Ergebnis einer asynchronen Operation dar, die ein Ergebnis vom Typ T erzeugt. Wenn das Ergebnis kein verwendbarer Wert ist, dann ist der Future-Typ Future<void>. Ein Future repräsentiert asynchron einen einzelnen Wert, entweder ein Datum oder einen Fehler

Es gibt 2 Möglichkeiten, mit Futures umzugehen:

  • Verwenden der Future-API
  • Verwenden des async-and-await-Vorgangs.

Lassen Sie uns nun ein Programm schreiben und die Ausgabe sehen.

Beispiel:

Dart

Future delayedPrint(int seconds, String msg) {
  final duration = Duration(seconds: seconds);
  return Future.delayed(duration).then((value) => msg);
}
main() async {
  print('Life');
  await delayedPrint(2, "Is").then((status){
    print(status);
  });
  print('Good');
}

Ausgabe-

Life
Is
Good

In diesem Fall haben wir async- und await-Schlüsselwörter verwendet. Warten hält im Grunde den Kontrollfluss, bis der Vorgang abgeschlossen ist. Um await innerhalb einer Funktion zu verwenden, müssen wir die Funktion mit dem Schlüsselwort async markieren. Dies bedeutet, dass diese Funktion eine asynchrone Funktion ist.

In Kombination mit der Futures-Klasse ist das Async/Await-Muster in Dart eine leistungsstarke und ausdrucksstarke Methode zur asynchronen Programmierung.