2015-06-01 204 views
2

我有一對嵌套的AJAX請求行爲不正確。 第一個獲得albums的列表,第二個獲得每個專輯的執行權,給我一個tracks的列表。奇怪的AJAX行爲與循環

$.ajax({ 
    url:getPHPSite(), 
    method:"POST", 
    data:{ 
     query: "SELECT id_album FROM albums;" 
    }, 
    success: function(response){ 
     var albums=JSON.parse(response); 
     for(var i=0; i<albums.length;i++){ 
      var albumID=albums[i]['id_album']; 
      getTracks(function(courses) { 
       //do something 
      } 
      }, albumID); 


     } 
    }, ....//error handler and everything else 

getTracks()函數實際上執行第二AJAX請求,並用一callback

function getTracks(callback, albumID){ 
    $.ajax({ 
     url:getPHPSite(), 
     method:"POST", 
     data:{ 
      query: "SELECT idtracks FROM tracksWHERE id_album=" + albumID + ";" 
     }, 


     success: function(response){ 
      array_tracks=JSON.parse(response); 
      callback(array_tracks); 
     }, //...everything else 

返回陣列軌道的通過將斷點,我發現,第一for loop被單獨執行

albumID=1 
albumID=2 
albumID=3 
...end 

,然後才執行getTracks()

我想getTracks()爲每個專輯迭代執行。

爲什麼會發生,我該如何解決?

+1

這是因爲JavaScript是同步的。在這裏閱讀答案:http://stackoverflow.com/questions/2035645/when-is-javascript-synchronous 基本上,你正在創建AJAX調用,但循環之後繼續AJAX解析。 – Hoyen

+1

你應該**從不**通過ajax發送一個mysql查詢批發!我希望這只是一個演示站點,因爲如果您執行查詢時沒有任何形式的輸入環境清潔,您就會招致麻煩! –

+0

是的,這是一個演示,不用擔心。感謝您的鏈接@Hoyen –

回答

1

如果您在使用Javascript異步方式時遇到問題,可以使用async: false標誌http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings禁用,但是您將失去javascript的權力。

我認爲這樣做的一種方式是創建一個數組,其中包含第一個端點的所有Ids,然後執行該數組的foreach,而不是在ajax中嵌入ajax,但僅用於代碼可維護性。

+0

好吧,我不想使用'async:false',因爲它已被**棄用**,所以我使用'.done()'管理了ajax調用(第二個調用在內部執行'.done()')。 關於您的解決方案,我發現它非常好,並將其實施到該程序的另一個部分,而這並不重要。所以非常感謝你:-) –

+0

真棒@RiccardoLomazzi:D – fjcero