2010-10-08 109 views
0

在第一个ajax调用服务器中返回一个转换为js数组的json字符串。我想为阵列的每个元素运行ajax调用。嵌套的AJAX调用

例如,首先ajax调用返回学期1,2,3,4。现在我想检索第1学期的科目,并将它们显示在表格中,然后检索第2学期的科目并显示表格中的所有科目,等等......

我编写了一个代码,但它显示了所有科目表。有人能帮我吗?

$.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

如果添加'dataType:'json'',则不需要'$ .parseJSON(data)'。 'data'将为你解析。 – 2010-10-08 17:22:13

回答

6

你内心的ajax调用中的回调通过引用捕获x变量。

由于所有回调都在循环之后运行,因此它们都获得当前值x,这是该集合中的最后一个元素。

您需要将循环中的代码移动到一个单独的函数中,该函数以x作为参数。

1

变量x的范围也可能导致问题。

相反的:

for(x in semesters) 

尝试:

for(var x in semesters) 

这将x声明为你的第一个成功的AJAX功能范围的变量,而不是作为一个全球性的,可以通过下列方式改变任何其他代码(包括jQuery)。

+0

这不会帮助。 (仍然只有一个'x'变量) – SLaks 2010-10-08 17:20:29

+0

OP正在调用一个库函数,它可以在第二个Ajax查询返回之前修改全局'x'。它并不能保证它不会。通过添加'var',可以避免这种可能性。 – Gus 2010-10-08 17:37:54

+0

这不太可能(尽管你是对的,他应该使用var)。真正的问题是重用;看到我的答案。 – SLaks 2010-10-08 18:07:39