J'essaie d'ajouter un ensemble d'objets qui ont été récupérés d'un fichier JSON dans un tableau. J'ai essayé d'utiliser push mais le résultat est le même. La valeur length du tableau reste 0. Qu'est-ce que je fais mal? Le JSON analyse bien car je peux obtenir les valeurs pendant la boucle.

<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>
0
XSL 30 oct. 2011 à 22:44

4 réponses

Meilleure réponse

getJSON() est une fonction asynchrone. Il ne commence à récupérer les données que lorsque vous l'appelez, et il n'appelle la fonction donnée qu'après l'avoir chargée. Vous appelez donc l'alerte avant que rien ne soit récupéré. Vous devriez avoir l'alerte juste après la fonction .each ().

3
Lycha 30 oct. 2011 à 18:47

Vous renvoyez le tableau avant d'y placer les objets.

La fonction de rappel utilisée dans la méthode getJSON ne s'exécute pas immédiatement, elle s'exécute lorsque la réponse arrive. Comme deux méthodes ne peuvent pas s'exécuter en même temps, vous aurez toujours quitté votre fonction avant que la fonction de rappel puisse s'exécuter.

Vous pouvez accéder au résultat dans la fonction de rappel:

<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
Guffa 30 oct. 2011 à 18:52

Ajax est asynchrone. Tout ce qui dépend du JSON doit se produire dans le rappel.

function performSearch()
{
    var url = "http://myjsonurl...";
    $.getJSON(url, function(response)
    {
        var myArray = $.map(response.data.people, function()
        {
            return new person(this.name, this.age);
        });

        alert(myArray.length);
    });     

    //always returns 0  
    alert(myArray.length);
    // that's because this code executes before the $.getJSON callback does
}
1
Matt Ball 30 oct. 2011 à 18:51
<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>
0
Riz 30 oct. 2011 à 18:47
7946955