Построение и назначение объектов JavaScript не работает - PullRequest
0 голосов
/ 27 июля 2011

Может кто-нибудь сказать, почему мой объект img не принимает своего значения вне вызова ajax?Я также использовал функцию конструктора для создания объекта, но это не сработало.И проанализированные значения XML работают, я проверял это.Если я переместу оповещение (img.location) внутри события успеха, появится правильное значение, но оно не выйдет за пределы функции ajax ..

Помогите, пожалуйста ...

function getImage(){
        img = new Object();
        $.ajax({
            type: "GET",
            url: "hvimage.xml",
            dataType: "xml",
            success: function(xmlData){
                var randImageId = Math.floor(Math.random()*3);
                $(xmlData).find("image").each(function(index, e){
                    if(index == randImageId){
                        img.id =  $(this).attr("id");
                        img.location = $(this).find("location").text();
                        img.answer = $(this).find("answer").text();
                    }
                });
            },
            error: function(xmdData){
                alert("error");
            }
        });
        alert("test");
        alert(img.location); //Keep getting undefined here..
    }

Еще раз спасибо,

Венн

Ответы [ 2 ]

6 голосов
/ 27 июля 2011

Поскольку ваш AJAX-запрос асинхронный , поэтому код, следующий за ним , не ожидает ответа до его выполнения.

Любой код, который полагается науспешный ответ должен быть помещен в или вызван из обратного вызова success:.

function getImage(){
    img = new Object();  // 1. create object

      // 2. send request
    $.ajax({
        type: "GET",
        url: "hvimage.xml",
        dataType: "xml",
        success: function(xmlData){

                // 4. response is received, and callback runs
            var randImageId = Math.floor(Math.random()*3);
            $(xmlData).find("image").each(function(index, e){
                if(index == randImageId){
                    img.id =  $(this).attr("id");
                    img.location = $(this).find("location").text();
                    img.answer = $(this).find("answer").text();
                }
            });
        },
        error: function(xmdData){
            alert("error");
        }
    });

      // 3. fire alerts
    alert("test");
    alert(img.location); //Keep getting undefined here..
}
1 голос
/ 27 июля 2011

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

Функция успеха запускается при возврате асинхронного запроса, тогда как два последних предупреждения запускаются сразу после того, как запрос отправлен . Данные, которые вы хотите использовать в этих двух последних оповещениях, просто еще не доступны для браузера.

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