Problem mit Rückgabewert
feddi
- javascript
0 JürgenB0 feddi1 Der Martin0 Struppi
Hallo zusammen,
ich habe eine Verständnisfrage. Ich habe ein Skript, was bei einem Ereignis via AJAX Daten nachladen soll. Diese Daten hole ich mir über diese Funktion:
function getDataFromSQL(type)
{
http_request = false;
if (window.XMLHttpRequest)
{
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType)
{
http_request.overrideMimeType('text/xml');
}
}
else if (window.ActiveXObject)
{
try
{
http_request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}
if (!http_request)
{
alert('Bitte aktivieren Sie ActiveX in Ihrem Browser');
return false;
}
http_request.open('GET', 'getSQL.php?type=' + type, true);
http_request.onreadystatechange = function()
{
if (http_request.readyState == 4)
{
var answerText = http_request.responseXML;
return answerText;
}
};
http_request.send(null);
}
Diese Funktion wird von dieser Funktion aufgerufen:
function getKBInfo()
{
var sqlAnswer = getDataFromSQL('KB');
return sqlAnswer;
}
Leider ist jedoch die Variable "sqlAnswer" immer "undefinied". Ich glaube zu verstehen warum, jedoch kann ich das Problem nicht lösen.
http_request.onreadystatechange = function()
{
if (http_request.readyState == 4)
{
var answerText = http_request.responseXML;
return answerText;
}
};
Dieser Teil soll ja die Antwort zurückliefern, wird aber nur bei onreadystatechange aufgerufen und liefert das Ergebnis an selbiges zurück oder? Damit liefert allerdings die Funktion "getDataFromSQL()" noch keinen Rückgabewert. Liege ich damit richtig? Wie kann ich das Problem lösen.
Ich bin dankbar für jede Hilfe.
Viele Grüße
Feddi
Hallo feddi,
das "A" in AJAX steht für Asynchron. D.H. der Request wird abgeschickt und das Script läuft weiter. Erst der onreadystatechange-Eventhandler erhält das Ergebnis des requests und kann mit diesem arbeiten. Lege also die Weiterverarbeitung dieser Daten in den Eventhandler. Ein "return" im Handler macht keinen Sinn.
Gruß, Jürgen
Hallo Jürgen,
um das mal Schritt für Schritt zu verstehen.
Ich rufe mit der Funktion getKBInfo().
Diese macht dann meinen Ajax Request. Wird dann nicht gewartet bis sqlAnswer eine Antwort von der Funktion erhalten hat, sondern läuft sofort weiter in der Funktion und führt das return aus?
var sqlAnswer = getDataFromSQL('KB');
return sqlAnswer;
Hallo,
um das mal Schritt für Schritt zu verstehen.
Ich rufe mit der Funktion getKBInfo().
so wie weiter unten beschrieben:
var sqlAnswer = getDataFromSQL('KB');
return sqlAnswer;
Das ist aber so, wie du es formuliert hast, schon Unsinn.
> Diese macht dann meinen Ajax Request.
Richtig formuliert: Diese Funktion sendet den Request. Mehr erstmal nicht.
> Wird dann nicht gewartet bis sqlAnswer eine Antwort von der Funktion erhalten hat, sondern läuft sofort weiter in der Funktion und führt das return aus?
Genau. Das ist so, als wenn du dem Chef ein Bestellformular zum Gegenzeichnen hinlegst. Natürlich kannst du daneben stehenbleiben und warten, bis er unterschrieben hat (->synchroner Request), aber das ist nicht der Normalfall. Normal ist wohl eher, dass du erstmal wieder mit dem Tagesgeschäft weitermachst, und Cheffe (oder Sekretärin) kommt irgendwann vorbei und legt dir den unterschriebenen Zettel auf den Tisch.
Deine Funktion getDataFromSQL() ist nun so gestrickt, dass sie \*gar kein Ergebnis\* liefert. Sie sendet den Request und kehrt dann sofort wieder zurück. Aber sie merkt sich vor, dass eine anonyme Funktion (nämlich der Handler für onreadystatechange) aufzurufen ist, sobald sich irgendwas ändert, z.B. die Antwort vom Server eingetroffen ist. Das kann aber durchaus erst Sekunden später sein.
Also nochmal zum Verständnis:
\* Erst Request senden und eine Handlerfunktion in onreadystatechange hinterlegen
\* Weitermachen mit dem Programmablauf, soweit das ohne die Server-Antwort möglich ist
\* Wenn der onreadystatechange-Handler aufgerufen wird und readyState=4 ist, kannst
du die Antwort verarbeiten
Klar soweit?
So long,
Martin
--
Wenn zwei dasselbe tun, sind sie vielleicht bald zu dritt.
um das mal Schritt für Schritt zu verstehen.
Ich rufe mit der Funktion getKBInfo().
Diese macht dann meinen Ajax Request. Wird dann nicht gewartet bis sqlAnswer eine Antwort von der Funktion erhalten hat, sondern läuft sofort weiter in der Funktion und führt das return aus?
Nein, sie kehrt sofort zurück und irgendwann wird die Funktion onreadystate ausgeführt.
var sqlAnswer = getDataFromSQL('KB');
return sqlAnswer;
Du musst eine Callbackfunktion benutzen, dort wo du die Antwort brauchst.
~~~javascript
getDataFromSQL('KB', function(answer) {
tu_was_mit(antwort);
} );
Dazu musst du aber auch die Funktion ein wenig umnbauen.
function getDataFromSQL(type, callback)
{
var http_request = null;// keine globalen Variabeln!
...
http_request.onreadystatechange = function()
{
if (http_request.readyState == 4)
{
var answerText = http_request.responseXML;
callback(answerText);
}
};
}
Struppi.