2010-10-08 7 views
0

dans le premier serveur d'appel ajax renvoie une chaîne json convertie en tableau js. Je veux lancer un appel ajax pour chaque élément de tableau.Les appels AJAX imbriqués

Par exemple, le premier appel ajax renvoie les semestres 1,2,3,4. Maintenant, je veux récupérer des sujets pour le semestre 1 et les montrer dans un tableau, puis récupérer des sujets du semestre 2 et montrer tous les sujets dans un tableau et ainsi de suite ...

J'ai écrit un code mais il montre tous les sujets en dernier table. Est-ce que quelqu'un peut m'aider?

$.ajax(
     { 
      type: "POST", 
      url: "returnSemesterNumbers", 
      data: "programId="+selectedprog, 
      success: function(data) 
      { 
       var semesters=$.parseJSON(data); 
       for(x in semesters) 
       { 
        semnum=semesters[x].semesterNumber; 
        alert(semnum); 
        $("#tables").append('<table id=table'+x+' style=float:left><tr><td>'+semnum+'</td></tr>'); 
        $.ajax(
          { 
           type: "POST", 
           url: "returnCourses", 
           data: "programId="+selectedprog+"&semNum="+semnum, 
           success: function(data1) 
           { 
            var courses=$.parseJSON(data1); 
            for(y in courses) 
            { 
             $("#table"+x).append('<tr><td>'+courses[y].title+'</td></tr>'); 
            } 
           } 
          }); 
        $("#table"+x).append('</table>'); 
        } 
       } 
      }); 
      } 
      else 
      { 
       $("#tables").css('display','none'); 
      } 
}); 
+3

Si vous ajoutez 'dataType: 'json'', vous n'aurez pas besoin de' $ .parseJSON (data) '. 'data' sera analysé pour vous. –

Répondre

6

Le rappel dans votre appel ajax interne capture la variable x par référence.

Étant donné que tous les rappels sont exécutés après la boucle, ils ont tous la valeur actuelle x, qui est le dernier élément de l'ensemble.

Vous devez déplacer le code de la boucle dans une fonction distincte qui prend en paramètre x.

1

La portée de la variable x peut également causer des problèmes.

Au lieu de:

for(x in semesters) 

essayer:

for(var x in semesters) 

qui déclarera x comme variable dans le cadre de votre première fonction ajax succès, plutôt que comme un monde qui peut être modifié par tout autre code (y compris jQuery).

+0

Cela ne va pas aider. (Il y aura toujours une seule variable 'x') – SLaks

+0

L'OP appelle une fonction de bibliothèque qui pourrait modifier le' x' global avant que la deuxième requête ajax ne retourne. Ce n'est pas une garantie que ce ne sera pas le cas. En ajoutant le 'var', cette possibilité est évitée. – Gus

+0

C'est peu probable (bien que vous ayez raison, il devrait utiliser 'var'). Le vrai problème est la réutilisation; vois ma réponse. – SLaks

Questions connexes