2012-02-16 174 views
2

我有以下代码:JQuery的等待Ajax响应

for (i=1;i<=pages;i++) { 
     $('#procout').append(Processing Page#"+i+"<br />"); 
     $.ajax({ 
      url: 'processor.php', 
      data: {storen: perpage, pagen : i}, 
      success: function(data) { 
       $('#procout').append(data+"<br />"); 

      } 
     }); 
    } 

我所要做的是使脚本等待每循环之后的Ajax响应。相反,它会按照服务器响应的顺序(乱序)将所有“处理页面”行打印在一起,并从每次运行中打印出Ajax响应。我尝试将async选项设置为false,但这只是导致JS等待所有六个请求完成,然后将所有运行的所有内容一起输出。

注意:页面,perpage和pagen的值与问题无关。

+0

你应该做的“阿贾克斯队列”和“jQuery的AJAX队列插件”一些搜索,因为它看起来这是你的愿望。 – 2012-02-16 21:56:10

回答

4

由于您已经尝试了制作ajax请求async:false(这很少是一个好主意),请考虑将您的循环体打破为一个函数,该函数会发出ajax请求,然后在回调中运行下一个请求:

function runRequest(num){ 
    if (num > pages) return; //since your original was looping while i <= pages 

    $('#procout').append("Processing Page#" + num + "<br />"); 
    $.ajax({ 
     url: 'processor.php', 
     data: {storen: perpage, pagen : num}, 
     success: function(data) { 
      $('#procout').append(data + "<br />"); 

      runRequest(num + 1); 
     } 
    }); 
} 

然后当然启动进程了与

runRequest(0); 
+1

,因为同步不会给页面更新时间。 – epascarello 2012-02-16 21:33:03

+0

循环永远不会结束......我甚至将页面添加为一个变量以传递给函数并检查其值。递归是否会造成这种情况?如果我保持循环并在每次运行中将处理过程传递给此函数,该怎么办? – 0pt1m1z3 2012-02-16 22:17:03

+0

该功能应该可以工作。你确定在回调中调用'runRequest(num + 1)'吗?如果碰巧你写了'runRequest(num ++)',那**不会**工作。 – 2012-02-16 22:24:54