2013-03-08 131 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