2013-03-08 88 views
1

我使用下面的代码迭代了一系列日期。每次我发出一个ajax请求并返回xml数据,然后调用一个函数在页面上的一行中显示一系列div。问题是我的循环已经完成,甚至在第一次ajax调用之前,我怎样才能保持for循环,直到我的ajax请求和函数完成?任何帮助非常感谢! ,谢谢for循环..等待AJAX​​请求

 // Start of the loop for the date range selected  

     for(loopTime = startTime; loopTime <= endTime; loopTime += 86400000) { 

     // Produce the day from the date 
       loopDate=new Date(loopTime) 
       day = loopDate.getDate() ;   if (day < 10) { day = "0" + day } ; 
       mon = loopDate.getMonth()+1 ; if (mon < 10) { mon = "0" + mon } ; 
       year = loopDate.getFullYear()  
       epDate = year + "-" + mon + "-" + day 

     // Run the XML Query ONCE ONLY 
       $.ajax({ 
        type: "POST", 
        url: "php_assoc/jobs_today.php", 
        data: { OnThisDate : epDate }, 
        dataType: "xml", 
        success:returnedXMLdata    
        }); 

     }// for loop date 




     function returnedXMLdata(data) { 
      script .... 
+0

Ajax中的A代表asynchonous,这意味着调用执行并自行关闭,并在代码的“回调”部分回答(“成功”)。清楚你在这里需要什么。 – 2013-03-08 16:17:27

+1

这造成了什么特别的问题?服务器重载,因为AJAX调用都是同时发生的? – Alnitak 2013-03-08 16:18:04

+0

该回调创建一个从日期(epDate)开始的div行,问题是我在同一日期的行之后行,这恰好是我for循环中的最后一个日期/,我想实现的是类似的到具有日期列表的日历 – Mick 2013-03-08 16:23:46

回答

5

您的问题,想必也不环路年初完成(这实际上是一件好事),但所有的AJAX请求得到几乎立即被解雇。

如果要排队的AJAX请求,您需要循环迭代使用事件处理程序本身,而无需使用for

var loopTime = startTime; 
(function iterate() { 
    $.ajax(...).always(function() { 
     loopTime += 86400 * 1000; 
     if (loopTime <= endTime) { 
      iterate(); 
     } 
    }); 
})(); 
3

在ajax请求中,添加一个异步属性并将其设置为false。

async: false, 
+3

虽然这会解决问题,但它非常糟糕,使用同步AJAX请求的做法很糟糕;您的浏览器将被锁定,并且在所有*您的AJAX请求期间无法使用。 – Matt 2013-03-08 16:16:34

+0

@Matt +1,从来没有永远做过_synchronous_ AJAX调用。这是一个坏主意,他们实际上将在未来版本的jQuery中删除它 – Alnitak 2013-03-08 16:22:55

+1

这是一个不好的建议。同步ajax调用锁定浏览器。这绝不是比适当的异步设计更好的用户体验。 – jfriend00 2013-03-08 16:36:53