Ajax responseText возвращается как неопределенный - PullRequest
2 голосов
/ 12 января 2011

У меня проблемы с этим фрагментом кода; возвращаемое значение возвращается как «неопределенное». В чем проблема?

var fx = null;
xmlhttp.open("GET", URL ,false);
xmlhttp.onreadystatechange=function() 
    {
        alert("enter func");            
    if (xmlhttp.readyState==4) 
        {
        if (xmlhttp.status == 200) 
            {                   
                alert(fx);                  
                fx = xmlhttp.responseText;
                return fx;
            }
        else
            {
                alert("Error" + xmlhttp.statusText);
            }
        }
    }

Более новый код:

function getData(callback)
 {      
    xmlhttp.open("GET", URL ,false);
    xmlhttp.onreadystatechange=function() 
        {               
        if (xmlhttp.readyState==4) 
            {
            if (xmlhttp.status == 200) 
                {                   
                    alert(xmlhttp.responseText);
                    cbfunc(xmlhttp.responseText);                   
                }
            else
                {
                    alert("Error" + xmlhttp.statusText);
                }
        }
    }   
        xmlhttp.send(null);
 }

Как я это называю:

getData( function cbfoo(txt)
         {
            //document.form.autodate.value=txt;
            alert(txt);
            alert(document.form.autodate.value);
         });`

1 Ответ

3 голосов
/ 12 января 2011

Обновление на основе ваших правок

function getData(callback)
 {       
    // you should  move the creation of xmlhttp in here
    // so you can make multiple getData calls if needed 
    // if you keep xmlhttp outside the function the different calls to getData will interfere 
    // with each other

    xmlhttp.open("GET", URL ,false); // false should be true, to make it async
    ...
                {                   
                    alert(xmlhttp.responseText);
                    cbfunc(xmlhttp.responseText); // your function gets passed as the 
                                                  // parameter "callback" but you're 
                                                  // using "cbfunc" here instead of "callback"
 ...
 getData(function cbfoo(txt) // you can omit the function name here
 ...

Исправление этих проблем должно заставить код работать.

Старый ответ

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

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

Вы должны (в 99% случаев) использовать Асинхронный режим и использовать обратный вызов для обработки данных, поскольку xmlhttp.open делает не , возвращая возвращаемое значение onreadystatechange обратный вызов, он просто немедленно возвращает undefined при запуске в асинхронном режиме.

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

function doRequest(url, callback) {
    var xmlhttp = ....; // create a new request here

    xmlhttp.open("GET", url, true); // for async
    xmlhttp.onreadystatechange=function() {     
        if (xmlhttp.readyState==4) {
            if (xmlhttp.status == 200) {

                // pass the response to the callback function
                callback(null, xmlhttp.responseText);

            } else {
                // pass the error to the callback function
                callback(xmlhttp.statusText);
            }
        }
    }
    xmlhttp.send(null);
}

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

doRequest('http://mysite.com/foo', function(err, response) { // pass an anonymous function
    if (err) {
        alert('Error: ' + err);

    } else {
        alert('Response: ' + response);
    } 
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...