Javascript 如何在jquerywhen-Then-statment中循环Ajax请求?
我试图从API异步加载一组数据,当加载所有数据时,我想触发一个事件,加载所有数据。我遇到的问题是,我使用的API将响应对象的数量限制为五个。我可能需要检索30-40个响应对象 所以我要做的是创建一个when-then语句,该语句循环遍历数据项,每五个项发出一个请求,然后在加载所有项时,我要触发一个加载的事件。我遇到的问题是when-then语句在ajax请求成功之前完成 我尝试过的代码Javascript 如何在jquerywhen-Then-statment中循环Ajax请求?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我试图从API异步加载一组数据,当加载所有数据时,我想触发一个事件,加载所有数据。我遇到的问题是,我使用的API将响应对象的数量限制为五个。我可能需要检索30-40个响应对象 所以我要做的是创建一个when-then语句,该语句循环遍历数据项,每五个项发出一个请求,然后在加载所有项时,我要触发一个加载的事件。我遇到的问题是when-then语句在ajax请求成功之前完成 我尝试过的代码 function loadsLotsOfStats(stats, dataType, eventName,
function loadsLotsOfStats(stats, dataType, eventName, dataName, callback) {
var groupedStats = [];
while (stats.length > 0) {
groupedStats.push(stats.splice(0, 5).join('/'));
}
j$.when(
groupedStats.forEach(function (d) {
loadJSONToData(model.apiUrl.replace("{IDS}", d), "json", "", dataName, function (d) { /*console.log(d);*/ }, true)
})
).then(function () {
j$(eventSource).trigger('dataLoaded', eventName);
});
loadJSONToData函数基本上只是异步$.ajax的包装函数
因此,是的,事件在数据实际加载之前被触发。出于某种原因,如果我试图将for循环放在when(when)语句中,是否会出现语法错误
有人对我如何发出一堆Ajax请求并等到它们全部完成后再触发事件有什么建议吗?或者对我目前的问题有什么建议
提前感谢您的帮助。您可以使用。并尝试该功能。您可以按要求执行操作。但是,您向其发送请求的服务器可能有其限制的原因。作为从事web开发的人员,他们亲眼目睹了DDOS、抓取和其他API滥用是多么烦人是的,我建议遵守他们的限制 话虽如此,你可以这样做 $.ajax实际上返回一个延迟对象,因此您可以将其用于您的优势。另外,$.when可以接受任意数量的延迟对象。结合这两个事实可以解决您的问题
var deferreds = [];
$.each(groupedStats, function(index, stat){
deferreds.push(
// No success handler - don't want to trigger the deferred object
$.ajax({
url: '/some/url',
data: {stat: stat},
type: 'POST'
})
);
});
// Can't pass a literal array, so use apply.
$.when.apply($, deferreds).then(function(){
// Do your success stuff
}).fail(function(){
// Probably want to catch failure
}).always(function(){
// Or use always if you want to do the same thing
// whether the call succeeds or fails
});
请注意,这不是竞争条件。虽然$.ajax是异步的,但$.each不是异步的,因此您的延迟列表将是到达$.when和$.then/$.fail/$之前的总列表。只有在它们全部完成后才会触发
编辑:我忘了添加5s分割,但这说明了总体思路。您可能可以从这里了解如何将其应用于您的问题。顺便说一句,您可以使用array.splice(0,5)若要从数组中获取下5个结果,.splice可以安全使用;如果元素总数小于5,它将只获取所有剩余元素。您也可以使用
if(condition.length<10){//code to execute}
。可能会重复竖起大拇指,这完全符合我的需要。回答很好,解释也很好。感谢您的时间。是的,我会研究访问我需要的数据的不同方式,因为您的权利限制是有原因的。解释很好!效果很好。如果我错过了它,我很抱歉,但是您如何抓住和删除它计算响应then函数参数将包括集体响应。对于第一篇ajax帖子,always()只调用一次。如何捕获循环中的所有调用方何时完成,无论是否成功?