kleines Problem mit Ajax-Response-Verarbeitung
Matze
- javascript
0 JürgenB
0 Matze0 Bademeister
0 Der Martin
0 molily
0 hotti0 Matze
Hallo!
Ich setze einen Ajax-Request ab. Der wird soweit auch verarbeitet. Nur hab ich ein Problem die Antwort zu verarbeiten.
Hier der betreffende Code-Ausschnitt:
if(request.status == 200){
var result = eval(request.responseText);
// alert(result); - funktioniert
// tuEtwas(result); - funktioniert
// return result; - funktioniert nicht!
}
Diese Ajax-Funktion wird aus einer anderen Funktion aufgerufen wo ich das Abfrage-Ergebniss weiter verarbeiten will. Ich bekomme aber kein Ergebniss. Die return Anweisung mit "return result;" wird also offenbar nicht ausgeführt.
var ajaxResult = runAjax();
alert(ajaxResult); // funktioniert nicht
/* tu dies, tu das... */
Wo liegt mein Fehler? Kann mir bitte jemand helfen?
Dank und Gruß, Matze
Hallo Matze,
Wo liegt mein Fehler? Kann mir bitte jemand helfen?
ich vermute, du hast vergessen, dass das "A" in "AJAX" für Asynchron steht.
Gruß, Jürgen
Hallo Jürgen!
ich vermute, du hast vergessen, dass das "A" in "AJAX" für Asynchron steht.
Ja, sieht wohl so aus.
Wie komme ich also an das zurückgelieferte Ergebniss? Wären Event-Handler eine Möglichkeit?
Ich steh grad ein bisschen auf dem Schlauch.
Matze
Hallo,
ich vermute, du hast vergessen, dass das "A" in "AJAX" für Asynchron steht.
Ja, sieht wohl so aus.
Wie komme ich also an das zurückgelieferte Ergebniss? Wären Event-Handler eine Möglichkeit?
ja, typischerweise für onreadystatechange des Ajax-Objekts. Hast du bisher sofort nach dem Aufrufen der send()-Methode erwartet, dass die Antwort schon da ist? Das geht natürlich auch, wenn man den Request synchron absetzt. Damit verschenkt man aber einen wesentlichen Vorteil von AJAX, nämlich dass das Script weiterlaufen kann, bis der Server endlich die Antwort geliefert hat.
So long,
Martin
PS: Und bitte gewöhn dir das überzählige 's' beim Ergebnis ab. Das gab's weder vor noch nach der Rechtschreibdeform.
Hi Jürgen.
ich vermute, du hast vergessen, dass das "A" in "AJAX" für Asynchron steht.
Ich dachte, das steht für "and".
;-)
Viele Grüße,
der Bademeister
Hallo,
Ich setze einen Ajax-Request ab. Der wird soweit auch verarbeitet. Nur hab ich ein Problem die Antwort zu verarbeiten.
wie stellt sich dieses Problem dar?
if(request.status == 200){
var result = eval(request.responseText);
Autsch. Wozu hier das eval(), das in diesem speziellen Fall nichts weiter tut, als das Argument unverändert durchzureichen? Warum greifst du nicht direkt auf request.responseText zu?
> ~~~javascript
// alert(result); - funktioniert
> // tuEtwas(result); - funktioniert
> // return result; - funktioniert nicht!
> }
Was bedeutet "funktioniert (nicht)" hier? Wie sieht der aufrufende Code aus, der den return-Wert in Empfang nimmt?
Diese Ajax-Funktion wird aus einer anderen Funktion aufgerufen wo ich das Abfrage-Ergebniss weiter verarbeiten will. Ich bekomme aber kein Ergebniss. Die return Anweisung mit "return result;" wird also offenbar nicht ausgeführt.
Unwahrscheinlich.
var ajaxResult = runAjax();
alert(ajaxResult); // funktioniert nicht
/* tu dies, tu das... */
Bitte nochmal im Zusammenhang, mit diesen Fragmenten kann ich mir nur schwer vorstellen, was da wirklich abgeht.
So long,
Martin
--
Die letzten Worte der Challenger-Crew:
Lasst doch mal die Frau ans Steuer!
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
var result = eval(request.responseText);
Autsch. Wozu hier das eval(), das in diesem speziellen Fall nichts weiter tut, als das Argument unverändert durchzureichen?
?? Wie kommst du darauf, dass eval hier den Parameter »unverändert durchreicht«?
Es führt den String als JavaScript-Code aus und gibt das Ergebnis der letzten Expression / des letzten Expression Statements zurück. Das, was eval immer macht. Das ergibt in den wenigsten Fällen dasselbe wie der Direktzugriff auf request.responseText.
Mathias
Hallo,
var result = eval(request.responseText);
Autsch. Wozu hier das eval(), das in diesem speziellen Fall nichts weiter tut, als das Argument unverändert durchzureichen?
?? Wie kommst du darauf, dass eval hier den Parameter »unverändert durchreicht«?
weil ich, wie schon öfter, auf den irreführenden Namen der Funktion eval() hereingefallen bin. Unkonzentriert. Für mich steht "eval" als Kurzform von "evaluate", also einen Ausdruck auswerten. Das ist aber genau das, was bei der Zuweisung sowieso passieren würde.
Daher hätte eval() eigentlich besser exec() heißen sollen, damit wäre etwas klarer gesagt, was der Aufruf *wirklich* tut.
Es führt den String als JavaScript-Code aus und gibt das Ergebnis der letzten Expression / des letzten Expression Statements zurück. Das, was eval immer macht.
Stimmt, da habe ich nicht aufgepasst.
Das heißt, dass das eval in diesem Fall nicht nur überflüssig, sondern sogar falsch ist.
Ciao,
Martin
Hi,
var result = eval(request.responseText);
?? Wie kommst du darauf, dass eval hier den Parameter »unverändert durchreicht«?
weil ich, wie schon öfter, auf den irreführenden Namen der Funktion eval() hereingefallen bin. Unkonzentriert. Für mich steht "eval" als Kurzform von "evaluate", also einen Ausdruck auswerten.
Ja, genau.
Das ist aber genau das, was bei der Zuweisung sowieso passieren würde.
Nein, ist es nicht.
result = "5 + 3";
ergibt etwas vollkommen anderes als
result = eval("5 + 3");
MfG ChrisB
Das heißt, dass das eval in diesem Fall nicht nur überflüssig, sondern sogar falsch ist.
Das wissen wir nicht. Matze hat (wenn ich das richtig sehe) nirgends geschrieben, was für Daten er überträgt und wie er sie weiterverarbeiten will.
Es kommt ganz darauf an, was in responseText drinsteht. Wenn es etwa einen JSON-String oder sonstwie als JavaScript interpretierbare komplexe Daten enthält, dann ist eval() durchaus eine Möglichkeit, daraus ein JavaScript-Objekt zu machen. Das native JSON.parse bzw. ein JSON-Parser in JavaScript sind da natürlich zuverlässiger und sicherer.
var jsonString = '{"prop" : "val"}';
var object = eval('(' + jsonString + ')');
alert(object.prop);
bzw.
var jsonString = '{"prop" : "val"}';
var object = JSON.parse(jsonString);
alert(object.prop);
Mathias
Es kommt ganz darauf an, was in responseText drinsteht. Wenn es etwa einen JSON-String oder sonstwie als JavaScript interpretierbare komplexe Daten enthält, dann ist eval() durchaus eine Möglichkeit, daraus ein JavaScript-Objekt zu machen.
Genau das.
Das native JSON.parse bzw. ein JSON-Parser in JavaScript sind da natürlich zuverlässiger und sicherer.
Gute Idee! Danke für den Hinweis!
hi Matze,
Diese Ajax-Funktion wird aus einer anderen Funktion aufgerufen wo ich das Abfrage-Ergebniss weiter verarbeiten will. Ich bekomme aber kein Ergebniss. Die return Anweisung mit "return result;" wird also offenbar nicht ausgeführt.
Du bist im xhr.readyState == 4 und xhr.status == 200. Hier in diesem Zweig muss die callbackfunktion liegen, das ist Deine custom-Funktion, welche die Response verarbeitet und ins DOM einbaut wo der Browser das rendern kann.
Damit dieser Teil des Codes ausgelagert werden kann und somit universell zur Verfügung steht, könntest Du das entsprechend organisieren, Stichwort: Closure, also mit einem Objekt arbeiten, an welchem die Custom-Callback-Funktion 'angehängt' ist. Als Beispiel, schau Dir mal die alibCore.js auf meiner Site an und im Tab 'Anwendungen' die Scripts, die damit arbeiten.
Hotti
Hallo hotti!
Damit dieser Teil des Codes ausgelagert werden kann und somit universell zur Verfügung steht, könntest Du das entsprechend organisieren, Stichwort: Closure, also mit einem Objekt arbeiten, an welchem die Custom-Callback-Funktion 'angehängt' ist. Als Beispiel, schau Dir mal die alibCore.js auf meiner Site an und im Tab 'Anwendungen' die Scripts, die damit arbeiten.
Herzlichen Dank! Genau darum ging es mir (also das Auslagern usw.) und sowas hab ich gesucht.
Matze