Как добавить обратный вызов в назначение переменных AJAX - PullRequest
1 голос
/ 16 мая 2011

У меня есть переменная responce, которая назначается через функцию AJAX send().Когда я делаю назначение ...

responce = send();

ответ возвращается до того, как отправка возвращает мне undefined, как я могу добавить обратный вызов, чтобы этого не случилось?

РЕДАКТИРОВАТЬ: разъяснение того, что я спрашиваю ..

Это все еще возвращает неопределенное.Я присваиваю переменную с помощью функции send send возвращает onreadystatechange, однако, когда мой код выполняется .. ответ возвращается как неопределенный, прежде чем send () сможет вернуться.Как остановить выполнение кода под ответом до тех пор, пока ему не будет присвоено значение ответа?

EDIT2:

Следующий код - моя функция отправки ...

 function send(uri)
{
    var xhr = new XMLHttpRequest();
    xhr.open("POST",uri,true);
    xhr.onreadystatechange = function (send){
        if(xhr.readyState == 4){
            return xhr.responseText;
        }   
    }
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
    xhr.send(null);
}

Ответы [ 4 ]

2 голосов
/ 16 мая 2011

Вы используете 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;
    }
}
2 голосов
/ 16 мая 2011

Полагаю, вы говорите о методе XMLHTTPRequest.send(), а не обертке фреймворка.

send ничего не возвращает.Он всегда будет возвращать undefined.

. Чтобы получить ответ HTTP, вам необходимо отслеживать onreadystatechange, как показывают многочисленные ответы StackOverflow и учебные пособия в Интернете (например, этот ).

0 голосов
/ 16 мая 2011

вы должны присвоить значение вашему ответу на событие readystatechange вашего запроса, примерно так:

req.onreadystatechange = function(){
 if (req.readyState===4) { // checks if data is already loaded.
    callback(req.responseText,req.status);  //call your callback function with response and status as parameters.           
 }
};
0 голосов
/ 16 мая 2011

попробуйте это:

function send(uri, callback)
{
    var xhr = new XMLHttpRequest();
    xhr.open("POST",uri,true);
    xhr.onreadystatechange = function (send){
        if(xhr.readyState == 4 and callback){
            callback();
        }   
    }
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
    xhr.send(null);
}

send("uri here", function(){
    //whatever needs to be done after request
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...