Назначить данные из jQuery getJSON в массив - PullRequest
4 голосов
/ 09 августа 2010

Как назначить данные, извлеченные с помощью getJSON(), массиву для дальнейшего использования?

Приведенный ниже URL-адрес getJSON возвращает правильно отформатированный JSON с 10 основными элементами, каждый из которых имеет подэлементы id, username, haiku (и другие). Если вы используете его, попробуйте сохранить элементы JSON в локальном файле, чтобы вы не получили ту же ошибку домена (т.е. JSON не загрузится, если вы извлекаете данные из другого домена).

Что происходит, так это то, что оповещение будет извлекать значение в обратном вызове getJSON, но снаружи значение не определено.


$(document).ready(function(){
    var haikus=[];
    alert("begin loop");
    $.getJSON('http://example.com/json.php',function(data){
         var i=0;
         for(i=0;i<data.length;i++){
            haikus[i]=[data[i].id,String(data[i].username),String(data[i].haiku)];
        }
            alert(haikus[0][1]);
    });
})

  • Да, это связано с предыдущим постом. Но я изначально слишком сильно упростил свою задачу, поэтому предоставленные первоначальные решения не решили ее. jQuery - получить данные JSON в массив

Ответы [ 2 ]

19 голосов
/ 09 августа 2010

Ваша проблема в том, что любой код за пределами (и после) запроса $.getJSON уже был выполнен к моменту получения ответа $.getJSON.

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

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


EDIT:

Для пояснения, в примере кода ниже, смотрите комментарии к коду. Это должно помочь объяснить проблему.

$(document).ready(function(){
    var haikus=[];
    alert("begin loop");
    $.getJSON('http://haikuennui.com/random.php',function(data){
         var i=0;
         for(i=0;i<data.length;i++){
            haikus[i]=[data[i].id,String(data[i].username),String(data[i].haiku)];
        }
                 // The data in haikus is available here becuase
                 //    this alert() doesn't run until the response is received.
            alert(haikus[0][1]);
    });

         // Here the data in haikus is NOT available because this line
         //     of code will run ***before*** the response from the AJAX
         //     request from above is received.
         // In other words, this alert() executes **immediately** without
         //     waiting for the $.getJSON() to receive its response.
    alert(haikus[0][1]);

});
0 голосов
/ 09 августа 2010

Я считаю, что если вы определяете переменную с помощью 'var haikus = что-то', переменная имеет локальную область видимости, а если вы определяете переменную с помощью 'haikus = что-то', она имеет глобальную область действия.

...