• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] Asynchroner HttpRequest liefert leeren responseText

bZerk

New member
Hallo zusammen :)

Für einen Teil eines Studienprojektes musste ich ein kleines Javascript schreiben. Ich bin nicht ganz fit in Javascript, aber es hat alles einwandfrei funktioniert. Es handelt sich um ein .js-file mit folgendem Inhalt:

Code:
function httpGet(theUrl) {

var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", theUrl, false);
xmlHttp.send();

var text = xmlHttp.responseText;

var obj = JSON.parse(text);

var arr = [obj.name, obj.sys.country, obj.weather[0].description, obj.main.temp, obj.weather[0].icon];

return arr;

}

Das Problem ist jetzt folgendes: Ich darf keinen synchronen Request benutzen. Stelle ich aber mittels "true" statt "false" um auf asynchron bekomme ich eine leeren responseText und entsprechend einen JSON.parse : parse error. Da ich wie gesagt nicht sehr fit bin in Sachen Javascript weiß ich mir leider nicht zu helfen. Daher hoffe ich, dass ihr mir weiterhelfen könnt :) es ist vielleicht noch wichtig zu erwähnen, dass die function httpGet einmal pro Sekunde aufgerufen wird.

Gruß

bZerk
 
So wird das nicht funktionieren. Du wirst aus einem asynchronen XHR niemals einen Rückgabewert für eine Funktion generieren können - genau das heißt ja asynchron. Das JS wartet nicht, bis der Request fertig ist, sondern läuft einfach weiter.

Du musst hier mit dem onreadystatechange-Event und callbacks (oder Promises, was um einiges eleganter wäre) arbeiten.
 
Danke für die schnelle Antwort!

Der return ist ziemlich wichtig. Das muss ich wohl anders lösen dann. Ich brauche das Skript für eine Applikation die ich mit QtCreator geschrieben habe. Komischerweise funktioniert diese einwandfrei auf meinem Windows 8 Laptop, auf meinem Raspberry Pi 3 mit Raspbian Jessie allerdings nicht. Da bekomme ich dann die Fehlermeldung "Synchronous XMLHttpRequests not supported". Gibt es dafür möglicherweise eine Lösung?
 
Der return ist ziemlich wichtig.
Dann kannst du auf keinen Fall mit asynchronen Requests arbeiten, aber ich dachte, du darfst keinen synchronen Request verwenden... wie kommst du denn darauf, dass du die nicht verwenden darfst? Aufgabenstellung? Oder wegen der Fehlermeldung?

... und was meinst du eigentlich genau mit
auf meinem Raspberry Pi 3 mit Raspbian Jessie allerdings nicht.
?

Jeder Browser unterstützt das - oder bis du mit nodeJS unterwegs?
 
Gut ich versuche es nochmal genauer zu erklären:

Ich schreibe an einer Applikation (Ich habe ausschließlich mit Qt gearbeitet), die am Ende auf einem Raspberry Pi 3 laufen soll. Geschrieben habe ich diese aber zunächst auf meinem Laptop. Teil der Applikation ist eine kleine Wetteranzeige. Dafür habe ich mich auf einer Seite angemeldet, die kostenlose APIs zur Verfügung stellt, und mithilfe des kleinen Javascripts habe ich mir dann die nötigen Daten geholt. Hat auf dem Laptop alles perfekt funktioniert. Als ich das Programm dann auf dem Pi ausgeführt habe (sowohl im QtCreator als auch als executable file) bekam ich die Fehlermeldung "Error: synchronous xmlhttprequest calls are not supported".

Nachdem ich dazu keine Lösung gefunden habe dachte ich mir, dass es vielleicht einfacher sei mit asynchronen requests zu arbeiten (daher die Aussage "ich darf keine synchronen requests benutzen"). Da ich aber den return brauche, gilt es jetzt eine Lösung zu finden, das Programm auf dem Pi zum Laufen zu kriegen. Allerdings habe ich dazu nach wie vor nichts gefunden
 
Allerdings habe ich dazu nach wie vor nichts gefunden
Da wirst du auch nichts zu finden. Du wirst bei einem asynchronen Request niemals einen synchronen return value bekommen, sondern musst immer mit einem Callback arbeiten. (sh. Inversion of Control Prinzip)
 
wie bekommst du eigentlich js auf einem rasp zum laufen? ist das node.js? oder läuft der browser auf dem rasp?
 
Bisher ja noch gar nicht. Die function des js-files rufe ich auch lediglich in einem QML-file auf, welches in das Projekt eingebunden wurde.
 
und wie sieht das zielbild aus?
und in welcher umgebung testest du, wo diese fehlermeldung zustande kommt?
 
und wie sieht das zielbild aus?

Ziel: Javascript sendet die Anfrage, bekommt Daten zurück und schickt alle wichtigen Daten als Array an das QML-File. Im QML-file wird das Array zerlegt, und die einzelnen Daten an das cpp.-file meines Qt-Projektes weitergegeben.

Meinst du die Entwicklungsumgebung oder Betriebssystem etc.?
 
wo läuft denn dieses js jetzt und wo soll es später laufen und in welchen umgebungen? und was ist ein qml-file?
 
Hat sich nun alles erledigt. Habe statt Raspbian Jessie jetzt Ubuntu MATE auf dem Pi installiert und schon klappt alles.
Trotzdem danke für die ganzen Antworden :)
 
mikdoe schrieb:
wie bekommst du eigentlich js auf einem rasp zum laufen? ist das node.js? oder läuft der browser auf dem rasp?
Nee ich seid alle Falsch, in Qt ist auch eine Javascript Engine drinne:
Integrating JavaScript | Qt 4.8

Hätte das aber alles über NodeJs geregelt. Mit einem Canvas Modul kann man simple 2d Grafiken in der Konsole laufen lassen.
https://github.com/tj/term-canvas


Dormilich schrieb:
Da wirst du auch nichts zu finden. Du wirst bei einem asynchronen Request niemals einen synchronen return value bekommen, sondern musst immer mit einem Callback arbeiten.
Doch das geht.. zumindest in Nodejs.
https://github.com/abbr/deasync

Ich nutze das auch bei einer kleinen Sache in meiner Anwendung. Ich komme mit der Klammerung so langsam durcheinander bei Ü2000 Zeilen :(){ :|:&};:;):orange:


Wozu überhaut Grafik auf der Raspe nutze die nur für Konsolen Anwendung.
 
Zuletzt bearbeitet:
Zurück
Oben