2017-07-20 39 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) 
});