2012-02-16 215 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