AJAX-запрос возвращает неопределенное значение - PullRequest
2 голосов
/ 13 июля 2011

По какой-то причине я всегда получаю undefined, если я возвращаю значение, но если я пытаюсь отобразить его в оповещении, я получаю значения php.


function getXMLHttp() {
  var xmlHttp

  try {
    //Firefox, Opera 8.0+, Safari
    xmlHttp = new XMLHttpRequest();
  } catch(e) {
    //Internet Explorer
    try {
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
        //Browser does not support AJAX
        return false;
      }
    }
  }

  return xmlHttp;
}

function isUsernameExists() {
  var xmlHttp = getXMLHttp();

  xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4) {
    handleResponse(xmlHttp.responseText);
    }
  }

  var str = document.getElementById('username').value.toString();
  xmlHttp.open("GET", "ajax.php?username="+str, true);
  xmlHttp.send(null);

}

Edit:


function handleResponse(response) {
    return response.toString();
}

Спасибо

Гай Дор

Ответы [ 3 ]

5 голосов
/ 13 июля 2011

Похоже, вы пытаетесь прочитать возвращаемое значение из этой функции:

function isUsernameExists() {

У него нет оператора return, поэтому оно всегда будет undefined.

Я предполагаю, что вы ожидаете, что этот оператор возврата передаст нужное вам значение:

return xmlHttp.responseText.toString();

Но это часть этой функции:

xmlHttp.onreadystatechange = function() {

Который вызывается автоматически, когдасобытие readystatechange срабатывает, а не с помощью какого-либо вызова функции, которую вы делаете.

Асинхронный JavaScript и XML редко используют XML, но являются асинхронными. Все, что вы хотите сделать с извлеченными данными, должно выполняться с помощью функции обратного вызова, которую вы назначаете для onreadystatechange .Он может вызывать другие функции, но он не может возвращать что-либо (по крайней мере, это не будет получено где-либо полезным).

0 голосов
/ 13 июля 2011

у вас есть оператор возврата в функции, которую вы здесь создаете,

xmlHttp.onreadystatechange = function() {

, но в функции нет оператора возврата,

function isUsernameExists() {

только потому, что вы создали функцию внутридругая функция не означает, что код в этой функции запускается.

код внутри созданной вами функции не будет выполняться до тех пор, пока от сервера не будет получен ответ, после чего исходная функция, создавшая вторую функцию, будетвыполнение уже завершено.

код не останавливается в ожидании ответа от сервера, вместо этого он продолжает выполняться и завершает выполнение.функция, созданная вами для обработки ответа от сервера, запускается позднее, когда ответ получен.

0 голосов
/ 13 июля 2011

Мы не видим достаточно вашего кода, чтобы полностью понять ситуацию, но вы имеете дело с асинхронной операцией, и единственный способ сообщить результат этой асинхронной операции - это вызвать функцию со значением, полученным из этого операция. Вы не можете просто вернуться из функции.

Это распространенное недоразумение (в шестой раз я отвечал на этот вопрос сегодня). Функция on для изменения состояния готовности не вызывается никаким вашим кодом. Он вызывается браузером изнутри, когда завершается вызов ajax. Это означает, что возвращение значения из этой функции ничего не даст и, конечно, не сообщит этот результат ни одному из ваших кодов. Если вы хотите передать этот результат некоторому вашему коду, то вам нужно вызвать некоторый код изнутри этой функции и передать ему желаемый результат, чтобы код мог воздействовать на него. Это нарушает нормальный процесс программирования, но требуется при работе с асинхронными операциями.

...