Получение неопределенного в javascript при вызове ajax

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 ответа

Решение

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

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

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

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

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

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

Проблема в том, что 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;
}​
Другие вопросы по тегам