Мне нужно запросить данные для JS-скрипта из базы данных MySQL (на основе идентификатора пользователя).
Я не нашел простого решения для JavaScript, и было невозможно загрузить данные с помощью ajax, поскольку база данных доступна в другом домене.
Я реализовал обходной путь, используя PHP и curl.
Теперь JS должен «дождаться» завершения запроса, но, конечно, скрипт работает асинхронно и не ждет ответа.
Я знаю, что на самом деле нельзя ждать в JS, но должно быть возможно возвращать значение, подобное этому.
Я также пытался использовать return
в качестве другого обратного вызова, но это, конечно, не сработало, потому что функция getter будет работать дальше.
Как я могу реализоватьпростой геттер, который «ждет» и возвращает ответ от HTTP-запроса?
Спасибо за любые другие подсказки.Я действительно потерян в данный момент.
Это выдержка из исходного кода:
/**
* 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;
}
Дополнительная информация об используемых функциях:
/**
* 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);
}
Не совсем соответствующий код, но требуется для HTTP-запроса:
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;
}