Обновление на основе ваших правок
function getData(callback)
{
// you should move the creation of xmlhttp in here
// so you can make multiple getData calls if needed
// if you keep xmlhttp outside the function the different calls to getData will interfere
// with each other
xmlhttp.open("GET", URL ,false); // false should be true, to make it async
...
{
alert(xmlhttp.responseText);
cbfunc(xmlhttp.responseText); // your function gets passed as the
// parameter "callback" but you're
// using "cbfunc" here instead of "callback"
...
getData(function cbfoo(txt) // you can omit the function name here
...
Исправление этих проблем должно заставить код работать.
Старый ответ
Вы вызываете запрос XMLHttpRequest в Синхронном режиме , это означает, что он будет блокировать сценарий до завершения запроса, поскольку вы назначаете ответный вызов onreadystatechange
после блокирующий вызов (это означает, что после того, как запрос уже завершен) ваш код никогда не получит уведомление.
Поскольку синхронный режим блокирует скрипт, он также блокирует пользовательский интерфейс браузера, поэтому использовать этот режим не рекомендуется.
Вы должны (в 99% случаев) использовать Асинхронный режим и использовать обратный вызов для обработки данных, поскольку xmlhttp.open
делает не , возвращая возвращаемое значение onreadystatechange
обратный вызов, он просто немедленно возвращает undefined
при запуске в асинхронном режиме.
Теперь общий шаблон - написать обертку для запроса и передать анонимную функцию этой обертке, которая позже будет вызвана обратно после завершения запроса.
function doRequest(url, callback) {
var xmlhttp = ....; // create a new request here
xmlhttp.open("GET", url, true); // for async
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4) {
if (xmlhttp.status == 200) {
// pass the response to the callback function
callback(null, xmlhttp.responseText);
} else {
// pass the error to the callback function
callback(xmlhttp.statusText);
}
}
}
xmlhttp.send(null);
}
Теперь вы можете сделать запрос и предоставить функцию, которая будет вызываться по завершении запроса, внутри этой функции вы затем делаете все, что хотите, с ответом.
doRequest('http://mysite.com/foo', function(err, response) { // pass an anonymous function
if (err) {
alert('Error: ' + err);
} else {
alert('Response: ' + response);
}
});
Это обычная модель программирования в браузере, всегда используйте асинхронное решение, если вы блокируете скрипт, вы блокируете весь браузер.