Ich versuche, einen sehr einfachen HTTP-Server zu erstellen, der eine Sache erledigt. Nach dem Empfang einer HttpRequest führt es eine Abfrage auf dem lokalen Datenbankserver aus und gibt eine Zeichenfolge basierend auf dieser Abfrage zurück.
Ich lerne Dart, und ich habe Probleme, Futures zu fassen. Ich dachte, ich würde sie verstehen, aber dieses Beispiel lässt mich glauben, dass ich wirklich keine Ahnung habe, wie sie funktionieren. Also, ich suche nicht nur nach einer Lösung für dieses Problem, sondern alle Hinweise, die ich auch gerne annehmen werde.
Hinweis: Dieser Code ist ein sehr primitives Beispiel dessen, was ich versucht habe zu erreichen, und um die Stackoverflow-Community zu erreichen, habe ich sie so weit wie möglich gekürzt / vereinfacht, während ich das Problem intakt halte.
Hier ist mein Server.dart Code
%Vor%Wenn ich also eine Anfrage an diesen Server sende, wird "START ---- END" zurückgegeben. Der Server gibt das erwartete Abfrageergebnis aus und druckt dann "START_END" aus. Das führt mich zu der Annahme, dass meine Anfrage Antwort schließt und zurückgibt, bevor das Abfrageergebnis verarbeitet wird.
Also, ob ich localhost: 9090 / asdf curl oder tatsächlich einen Client-HTTP-Request-Sender erstelle, bekomme ich nicht die Antwort, die ich erwarte ... das ist ein Datenbankabfrageergebnis.
Vielen Dank im Voraus
Dass "START----END"
"out of order" gedruckt wird, ist ein Verhalten von Futures, das für die meisten Entwickler am Anfang verwirrend ist.
Ein Aufruf wie connection.query()
, der eine Zukunft zurückgibt, wird nicht sofort ausgeführt, sondern zur späteren Ausführung in eine Warteschlange eingetragen. Der aktuelle Thread der Ausführung wird bis zum Ende fortgesetzt, und dann wird die Warteschlange nacheinander abgearbeitet.
Was in Ihrem Code nicht funktioniert, ist, dass Sie einen asynchronen Aufruf connection.query()
ausführen und fortfahren, als ob es ein Synchronisierungsaufruf wäre. Das funktioniert bei Dart nie. Wenn Sie eine asynchrone Ausführung starten, können Sie nicht mehr zur Synchronisierung zurückkehren. (soweit ich weiß, sollte das geplante async / wait dies lösen).
Weitere Details unter dartlang.org Die Eventschleife und der Dart
Siehe auch Gregs Antwort auf diese Frage, wie SqlJocky Ergebnisse zu lesen sqljocky Abfrage Datenbank synchron
Tags und Links dart dart-io dart-async sqljocky