#javascript #ajax
#javascript #ajax
Вопрос:
У меня есть переменная, responce
которая назначается с помощью функции AJAX send()
. Когда я выполняю назначение…
responce = send();
ответ возвращается перед отправкой, возвращая мне undefined
как я могу добавить обратный вызов, чтобы этого не происходило?
РЕДАКТИРОВАТЬ: разъяснение того, о чем я спрашиваю..
Он по-прежнему возвращает undefined. Я присваиваю переменную с помощью функции send однако отправка возвращает onreadystatechange при выполнении моего кода.. ответ возвращается как неопределенный, прежде чем send() сможет вернуть. Как мне остановить выполнение кода в ответ, пока ответу не будет присвоено значение отправки?
ПРАВКА2:
Следующий код является моей функцией отправки…
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);
}
Комментарии:
1. Пожалуйста, предоставьте какой-нибудь код, чтобы получить более точные ответы, очень сложно дать ответ, не видя какого-либо кода.
Ответ №1:
Вы используете Ajax асинхронным образом, но рассматриваете его как синхронный.
Асинхронные вызовы выполняются для выполнения своей работы, в то время как остальной код после первоначального вызова send выполняется. Вы получаете undefined, потому что код ничего не возвращает.
Если вы посмотрите на объект 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:
Я полагаю, вы говорите о XMLHTTPRequest.send()
методе, а не обертке фреймворка.
send
ничего не возвращает. Он всегда будет возвращаться undefined
.
Чтобы получить HTTP-ответ, вам нужно отслеживать onreadystatechange
, как демонстрируют бесчисленные ответы на StackOverflow и интернет-руководства (например, это).
Комментарии:
1. @Skizit Тогда в чем вопрос?
2. Он по-прежнему возвращает undefined. Однако я присваиваю переменную с помощью функции
send
send returnsonreadystatechange
, когда выполняется мой код..response
возвращает как неопределенный, прежде чемsend()
сможет вернуться. Как мне остановить выполнение кода подresponse
до тех пор, пока ответу не будет присвоено значение отправки?
Ответ №3:
вы должны присвоить значение вашему ответу на событие 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.
}
};
Ответ №4:
попробуйте это:
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
})
Комментарии:
1. что, если отправка принимает параметры?
2. @Skizit: Я не могу знать ответ без хорошего вопроса 🙂 попробуйте новый ответ….