Ich muss Daten für ein JS-Skript aus einer MySQL-Datenbank (basierend auf einer Benutzer-ID) anfordern.
Ich habe keine einfache Lösung für JavaScript gefunden und es war auch nicht möglich, die Daten per Ajax zu laden, da die Datenbank unter einer anderen Domain verfügbar ist.
Ich habe einen Workaround mit PHP und curl implementiert.
Jetzt muss das JS auf das Ende der Anfrage "warten", aber das Skript läuft natürlich asynchron und wartet nicht auf die Antwort.
Ich weiß, dass es nicht wirklich möglich ist, in JS zu warten, aber es muss möglich sein, Wert wie diese zurückzugeben.
Ich habe auch versucht, mit einer return
als weiteren Callback, aber das funktionierte natürlich nicht, da die Getter-Funktion sowieso weiterläuft.
Wie kann ich einen einfachen Getter implementieren, der "wartet" und die Antwort der HTTP-Anfrage zurückgibt?
Danke für jeden weiteren Hinweis. Ich bin im Moment wirklich verloren.
Dies ist ein Auszug aus dem Quellcode:
/**
* Simple getter which requests external data
*/
function simple_getter() {
// http request using a php script, because ajax won't work crossdomain
// this request takes some time. function finished before request is done.
/* Example */
var url = "http://example-url.com/get_data.php?uid=1234";
var response_callback = handle_result_response;
var value = send_request( url, response_callback );
value = value.split('*')[0];
if (value === '' || value == const_pref_none) {
return false;
}
/* 1. returns undefinied, because value is not yet set.
2. this as a callback makes no sense, because this function
will run asynchronous anyway. */
return value;
}
Zusätzliche Informationen zu den verwendeten Funktionen:
/**
* Callback for the send_request function.
* basically returns only the responseText (string)
*/
function handle_result_response(req) {
// do something more, but basically:
return req.responseText;
}
/**
* Requests data from a database (different domain) via a PHP script
*/
function send_request( url, response_callback ) {
var req = createXMLHTTPObject();
if (!req)
return;
var method = (postData) ? "POST" : "GET";
req.open(method, url, true);
req.setRequestHeader('User-Agent','XMLHTTP/1.0');
// More not relevant source code
// ...
req.onreadystatechange = function () {
// More not relevant source code
// ...
response_callback(req);
}
if (req.readyState == 4)
return;
req.send(postData);
}
Nicht wirklich relevanter Code, aber erforderlich für die HTTP-Anfrage:
var XMLHttpFactories = [
function () {return new XMLHttpRequest()},
function () {return new ActiveXObject("Msxml2.XMLHTTP")},
function () {return new ActiveXObject("Msxml3.XMLHTTP")},
function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];
function createXMLHTTPObject() {
var xmlhttp = false;
for (var i=0; i<XMLHttpFactories.length; i++) {
try {
xmlhttp = XMLHttpFactories[i]();
} catch (e) {
continue;
}
break;
}
return xmlhttp;
}