2017-07-20 53 views
0

我需要在一個循環中創建ajax調用,在完成前一個新調用之後。jQuery - 用於循環ajax調用

for (var year = 2000; year <= 2017; year++) 
{ 
    $.ajax(
    { 
     url: 'calendar.php?year=' + year, 
     beforeSend: function() 
     { 
      console.log('Loading year: ' + year); 
     }, 
     success: function(result) 
     { 
      $('#events').append(result); 
     } 
    }); 
} 

但是當我檢查控制檯時,所有的調用是在同一時間進行的。

+2

這是因爲for循環在幾毫秒內執行。如果你想延遲調用,可以使用'setInterval()'或者鏈接的'setTimeout()'調用 - 儘管我建議如果可能的話請求一次請求獲取所有相關年份的數據。向您的服務器發送17個快速AJAX請求*您擁有的併發用戶數量不是一個好主意 –

回答

2

您可以使用jQuery的Promise API來鏈接請求。 只要根據要求完成了queryYears被稱爲另一時間遞增的year,直到year更大然後maxYear

function queryYears(year, maxYear) { 
    // check if the year is less or equal maxYear 
    if (year <= maxYear) { 
    return $.ajax({ 
     url: 'calendar.php?year=' + year, 
     beforeSend: function() { 
      console.log('Loading year: ' + year); 
     } 
     }) 
     .then(function(result) { 
     $('#events').append(result); 

     //incremenat year by one 
     year++; 

     //only call queryYears if year is less or equal to maxYear 
     if (year <= maxYear) { 
      return queryYears(year, maxYear); 
     } 
     }) 
    } else { 
    // if not return a rejected Promise 
    return Promise.reject(new Error(year + ' is larger then ' + mxYear)) 
    } 
} 



queryYears(2000, 2017) 
.then(function() { 
    console.log('finished') 
}) 
.catch(function(err) { 
    console.log('failed with: ') 
    console.dir(err) 
});