Jquery 对于循环。。等待AJAX请求

Jquery 对于循环。。等待AJAX请求,jquery,ajax,Jquery,Ajax,我正在用下面的代码遍历一系列日期。每次,我都会发出一个ajax请求并返回xml数据,然后调用一个函数在页面的一行上显示一系列div。问题是我的循环甚至在第一次ajax调用之前就已经完成了,如何保持for循环直到ajax请求和函数完成?非常感谢您的帮助,谢谢 // Start of the loop for the date range selected for(loopTime = startTime; loopTime <= endTime; l

我正在用下面的代码遍历一系列日期。每次,我都会发出一个ajax请求并返回xml数据,然后调用一个函数在页面的一行上显示一系列div。问题是我的循环甚至在第一次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 .... 
//所选日期范围的循环开始

对于ajax请求中的(loopTime=startTime;loopTime,添加一个异步属性并将其设置为false

async: false,

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

async: false,

您的问题可能不是循环提前完成(这实际上是一件好事),而是所有AJAX请求几乎立即被触发

如果希望将AJAX请求排队,则需要使用事件处理程序本身使循环迭代,而不使用
for

var loopTime = startTime;
(function iterate() {
    $.ajax(...).always(function() {
        loopTime += 86400 * 1000;
        if (loopTime <= endTime) {
            iterate();
        }
    });
})();
var loopTime=startTime;
(函数iterate(){
$.ajax(…).always(函数(){
环时间+=86400*1000;

如果(loopTime您的问题可能不是循环提前完成(这实际上是一件好事),而是所有AJAX请求几乎立即被触发

如果希望将AJAX请求排队,则需要使用事件处理程序本身使循环迭代,而不使用
for

var loopTime = startTime;
(function iterate() {
    $.ajax(...).always(function() {
        loopTime += 86400 * 1000;
        if (loopTime <= endTime) {
            iterate();
        }
    });
})();
var loopTime=startTime;
(函数iterate(){
$.ajax(…).always(函数(){
环时间+=86400*1000;

如果(loopTime虽然这可以解决问题,但使用同步AJAX请求是非常非常糟糕的做法;在所有AJAX请求期间,您的浏览器将被锁定且不可用。@Matt+1,从来没有,从来没有,从来没有,从来没有进行过同步AJAX调用。这是一个非常糟糕的想法,他们实际上会在未来版本的jQuer中删除它这是一个错误的建议。同步ajax调用会锁定浏览器。这是一个比正确的异步设计更好的用户体验。虽然这会解决问题,但使用同步ajax请求是非常非常糟糕的做法;在所有ajax请求期间,浏览器将被锁定且不可用。@Matt+1,ever,ever,ever,曾经进行过同步AJAX调用。这是一个糟糕的主意,他们实际上会在未来版本的jQueryThis中删除它。这是一个糟糕的建议。同步AJAX调用会锁定浏览器。这从来都不是一个比正确的异步设计更好的用户体验。AJAX中的a代表异步,意味着调用会被执行并自动启动n并在代码的“回调”部分(“成功”)中给出答案。请明确此处需要什么。这会导致什么特殊问题?由于AJAX调用一次发生,服务器会过载?回调会创建一行以日期(epDate)开始的div,问题是我得到了一行又一行的相同日期,这恰好是for循环中的最后一个日期,我想要实现的是类似于日历的日期列表,谢谢!!AJAX中的a代表asynchonous,这意味着调用会自动执行并在代码的“回调”部分进行应答(“success”)。请明确您在这里需要什么。这会导致什么特殊问题?由于AJAX调用同时发生,服务器会过载?回调会创建一行以日期(epDate)开始的div,问题是我得到了一行又一行的相同日期,这恰好是for循环中的最后一个日期/,我想要实现的类似于一个日历,上面有一个日期列表,谢谢!!