Как добавить обратный вызов к назначению переменной AJAX

#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 returns onreadystatechange , когда выполняется мой код.. 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: Я не могу знать ответ без хорошего вопроса 🙂 попробуйте новый ответ….