2015-06-01 207 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