2010-10-08 103 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