Получение неопределенного в JavaScript при вызове ajax - PullRequest
1 голос
/ 07 июля 2010
function get_request(url) {
  var request = new getXMLObject();
  request.onreadystatechange = function () {
    if (request.readyState == 4) {
      alert(request.responseText);
      var data = eval('(' + request.responseText + ')');
      alert(data);
      return data;
    }   
  }
  request.open("GET", url, true);
  //alert(document.getElementById('energy').innerHTML);
  request.send();
}

function loadjobs() {
  var url = "loadjobs.php?tab=1&id=1111";
  //var data=
  //alert(check());
  alert(get_request(url));
  //alert(data);
}

Когда я получаю данные в формате JSON ... я получаю NULL в alert(get_request(url)); пока я вхожу в alert(data);

Помоги мне

Ответы [ 4 ]

3 голосов
/ 07 июля 2010

Это потому что запрос в асинхронном режиме.Функция get_request(url) возвращает что-либо и, следовательно, нулевое значение (хотя я думаю, что оно должно быть неопределенным, а не нулевым).

Функция onreadystatechange вызывается позже во время, когда запрос AJAX былзавершено, и данные возвращаются с сервера, и, следовательно, предупреждение там работает.

0 голосов
/ 07 июля 2010

Ну, это асинхронный вызов.Вы получите данные вашего запроса после того, как get_request уже будет возвращено.Это означает, что ваш request.onreadystatechange = function () будет выполнен через много времени после того, как alert(get_request(url)); уже завершен.Это означает, что get_request не сможет вернуть данные из вызова AJAX.Это то, для чего у вас есть функция обратного вызова request.onreadystatechange для выполнения кода в неопределенное время, когда вы получили ответ.

0 голосов
/ 07 июля 2010

Проблема в том, что Ajax-запросы работают асинхронно . Таким образом, вы не можете вернуть данные сразу. Для этого вам нужно указать функцию обратного вызова , которая будет обрабатывать данные ответа.

function handleJSON( data ) {
  // ...
  // do whatever you want to do with the data
}

ajax( "url/file.php?param=value", handleJSON );

////////////////////////////////////////////////////////////////////////////////

function getXmlHttpObject() {
    var xmlHttp;
    try {
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}

function ajax(url, onSuccess, onError) {
    var xmlHttp = getXmlHttpObject();
    xmlHttp.onreadystatechange = function () {
        if (this.readyState == 4) {
            // onError
            if (this.status != 200) {
                if (typeof onError == 'function') {
                    onError(this.responseText);
                }
            }
            // onSuccess
            else if (typeof onSuccess == 'function') {
                onSuccess(this.responseText);
            }
        }
    };
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
    return xmlHttp;
}​
0 голосов
/ 07 июля 2010

Это неправильное понимание того, как работает AJAX. Ajax асинхронный . Функция onreadystatechange будет вызываться после loadjobs(). Указанный вами «обратный путь» никогда не сработает. get_request() никогда не сможет вернуть выбранное значение.

У вас есть два варианта. Или сделайте сценарий синхронным - это можно сделать, но не рекомендуется, потому что это может заморозить браузер.

Или, лучше, обрабатывать все, что вам нужно сделать, в обратном вызове onreadystatechange.

...