Код не добавляет объект в массив - PullRequest
0 голосов
/ 30 октября 2011

Я пытаюсь добавить набор объектов, которые были извлечены из файла JSON, в массив.Я пытался использовать push, но результат тот же.Значение length массива остается 0.Что я делаю неправильно?JSON анализирует нормально, так как я могу получить значения во время цикла.

<script type="text/javascript"> 

//my array
var myArray = new Array();

function performSearch(){

    var url = "http://myjsonurl...";
    var counter = 0;

    $.getJSON(url, function(response){
         $.each(response.data.people, function() {

            //p is the the object to add to the array
            var p = new person(this.name, this.age);

            //tried using myArray.push instead of having a counter, but
            //I get the same length of 0.
            myArray[counter] = p;
            counter++;
        });

    });     

    //always returns 0  
    alert(myArray.length);

}

... 
</script>

Ответы [ 4 ]

3 голосов
/ 30 октября 2011

getJSON() - асинхронная функция. Он только начинает извлекать данные, когда вы вызываете их, и вызывает данную функцию только после того, как загрузит их. Таким образом, вы вызываете оповещение до того, как что-либо получено Вы должны получить предупреждение сразу после функции .each ().

1 голос
/ 30 октября 2011

Вы возвращаете массив перед тем, как поместить в него объекты.

Функция обратного вызова, используемая в методе getJSON, запускается не сразу, а при получении ответа. Поскольку два метода не могут выполняться одновременно, вы всегда выходите из своей функции до того, как функция обратного вызова может быть запущена.

Вы можете получить доступ к результату внутри функции обратного вызова:

<script type="text/javascript"> 

function performSearch(){

  var url = "http://myjsonurl...";

  $.getJSON(url, function(response){

    var myArray = [];

    $.each(response.data.people, function() {
      var p = new person(this.name, this.age);
      myArray.push(p);
    });

    alert(myArray.length);

  });     

}

</script>
1 голос
/ 30 октября 2011

Ajax является асинхронным.Все, что зависит от JSON, должно произойти в обратном вызове.

0 голосов
/ 30 октября 2011
<script type="text/javascript"> 

//my array
var myArray = new Array();
var counter = 0;

function performSearch(){

    var url = "http://myjsonurl...";

    $.getJSON(url, function(response){
         $.each(response.data.people, function() {

            //p is the the object to add to the array
            var p = new person(this.name, this.age);

            //tried using myArray.push instead of having a counter, but
            //I get the same length of 0.
            myArray[counter] = p;
            counter++;

            alert(myArray.length);

        });

    });     


}

... 
</script>
...