Не могу получить доступ к значению переменной в JavaScript - PullRequest
3 голосов
/ 15 декабря 2011

У меня есть следующий исходный код:

var labeled_pic = new Array();
var testing;
function get_label_pic(){
    $.ajax({
        url: "localhost/advanceSearch/index/getlabelpic",
        type: "POST",
        dataType: "json",
        success: function(data) {
            $.each(data, function(key, data){
                labeled_pic[key] = data;
            });
            testing = "testing";
        }
    });
};
get_label_pic();
console.log(labeled_pic);

И затем я вызываю эти функции, используя get_label_pic();, после этого я хочу получить доступ к массиву labeled_pic, используя labeled_pic[3], но он возвращает undefined,Я использую firebug, и я пытаюсь написать это console.log(labeled_pic), и оно возвращает: Firebug result Как я могу получить доступ к переменной labeled_pic,.?

Ответы [ 5 ]

2 голосов
/ 15 декабря 2011

Проблема заключается в том, что вы делаете асинхронный вызов (запрос AJAX), поэтому ваш JavaScript продолжается и не ждет ответа на вызов.

Таким образом, вызов get_label_pic() совсем не займет времени, и ваш код перейдет прямо к console.log(labeled_pic) (который еще не будет установлен, поскольку обратный вызов success в вашем вызове AJAX не будет иметь завершено.

Если вы хотите нам это сделать, тогда вам нужно поместить свой код в свой успех AJAX или вызвать из него другую функцию:

function get_label_pic(){
    $.ajax({
        url: "localhost/advanceSearch/index/getlabelpic",
        type: "POST",
        dataType: "json",
        success: function(data) {
            $.each(data, function(key, data){
                labeled_pic[key] = data;
            });
            testing = "testing";

            console.log(labeled_pic); // this will show the values
            callmyOtherFunction(); // To call something else
        }
    });
};
get_label_pic();
console.log(labeled_pic); // This will be undefined

На самом деле происходит следующее:

  1. Создает функцию get_label_pic
  2. Звонки get_label_pic()
    1. Делает запрос Ajax
  3. Звонки console.log
  4. Сценарий в конце
  5. Проходит некоторое время, затем ответ сервера возвращается
    1. Итерация по данным, установка labeled_pic[key]
    2. Наборы testing = 'testing'
    3. Звонки console.log(labeled_pic);
    4. Звонки callmyOtherFunction()
1 голос
/ 15 декабря 2011

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

function get_label_pic(){
    $.ajax({
        url: "localhost/advanceSearch/index/getlabelpic",
        type: "POST",
        dataType: "json",
        success: function(data) {
            $.each(data, function(key, data){
                labeled_pic[key] = data;
            });
            testing = "testing";
        },
        complete: doWhatYouWantToDo()
    });
};

function doWhatYouWantToDo()
{
   alert(labled_pic[3]); // <!-- now the array is populated
}
0 голосов
/ 15 декабря 2011

Вы должны выполнить этот код в конце функции успеха, поэтому ваш код должен выглядеть следующим образом: <pre> var labeled_pic = new Array(); var testing; function get_label_pic(){ $.ajax({ url: "localhost/advanceSearch/index/getlabelpic", type: "POST", dataType: "json", success: function(data) { $.each(data, function(key, data){ labeled_pic[key] = data; }); testing = "testing";</p> <pre><code> $("#result").append("<img src='" + labeled_pic[3] +"' />"); } });

};get_label_pic ();

0 голосов
/ 15 декабря 2011

Вы должны вызвать console.log (labeled_pic); внутри успешного обратного вызова $ .ajax

...
 success: function(data) {
            $.each(data, function(key, data){
                labeled_pic[key] = data;
            });
            testing = "testing";
            //here call the console.log
        }
...
0 голосов
/ 15 декабря 2011

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

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

HTH

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