Вы используете Ajax в асинхронном режиме, но вы рассматриваете его как синхронный.
Асинхронные вызовы выполняются, чтобы выполнить свою работу, в то время как остальная часть кода после первоначального вызова отправки выполняется. Вы получаете неопределенное значение, потому что код ничего не возвращает.
Если вы посмотрите на объект XMLHttpRequest, 3-й аргумент в методе open - это асинхронный флаг.
open("method", "URL"[, asyncFlag[, "userName"[, "password"]]])
Если установить значение true [значение по умолчанию выключено], будет выполняться асинхронный вызов. Установка его в false сделает его синхронным.
Проблема с использованием синхронных вызовов заключается в том, что он блокирует браузер пользователя до тех пор, пока вызов не будет возвращен. Это означает, что анимированные GIF-файлы, таймеры браузера останавливаются и так далее. Если сервер отвечает навсегда, пользователь ничего не может сделать.
Лучшее решение - избегать использования синхронных вызовов. Используйте обратный вызов, чтобы продолжить выполнение кода.
Итак, основываясь на ваших изменениях, я отредактирую свой ответ базовым решением
function send(uri, callback)
{
var xhr = new XMLHttpRequest();
xhr.open("POST",uri,true);
xhr.onreadystatechange = function (send){
if(xhr.readyState == 4){ //You really should check for status here because you can get 400, 500, etc
callback(xhr.responseText);
//return
}
}
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
xhr.send(null);
}
function myFunction(){
var myUrl = "foo.php";
//show a loading message or soemthing
var someDiv = document.getElementById("loadingMessage");
someDiv.style.display = "block";
//Second half of your function that handles what you returned.
function gotData( value ){
someDiv.style.display = "none";
alert(value);
}
send(myUrl, gotData);
}
Если вы действительно хотите делать синхронно, и вы не против заблокировать браузер пользователя
function send(uri, callback)
{
var xhr = new XMLHttpRequest();
xhr.open("POST",uri,false);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
xhr.send(null);
if(xhr.status==200){
return xhr.responseText;
}
else{
return null;
}
}