我试图从API异步加载一组数据,当加载所有数据时,我想触发一个事件,加载所有数据。我遇到的问题是,我使用的API将响应对象的数量限制为五个。我可能需要检索30-40个响应对象
所以我要做的是创建一个when-then语句,该语句循环遍历数据项,每五个项发出一个请求,然后在加载所有项时,我要触发一个加载的事件。我遇到的问题是when-then语句在ajax请求成功之前完成
我尝试过的代码
函数加载slotsofstats(stats、数据类型、事件名、数据名、回调){
var groupedStats=[];
while(stats.length>;0){
groupedStats.push(stats.splice(0,5).join('/');
}
j$。什么时候(
groupedStats.forEach(函数(d){
loadJSONToData(model.apiUrl.replace(“{IDS}”,d),“json”,“”,数据名,函数(d){/*console.log(d);*/},true)
})
).然后(函数(){
j$(eventSource).trigger('dataLoaded',eventName);
});
loadJSONToData函数基本上只是异步$.ajax的包装函数
所以,是的,事件是在数据实际加载之前触发的。也是出于某种原因,如果我试图通过语法错误将for循环放在when(when)语句中
有人对我如何发出一堆Ajax请求并等到它们全部完成后再触发事件有什么建议吗?或者对我目前的问题有什么建议
提前谢谢你的帮助
可以按您的要求执行。但是,您发送请求的服务器可能有其限制的原因。作为一名从事web开发的人员,他亲眼目睹了DDOS、抓取和其他API滥用是多么令人讨厌,我建议遵守他们的限制
话虽如此,你可以这样做
$.ajax实际上返回一个延迟对象,因此您可以将其用于您的优势。另外,$.when可以接受任意数量的延迟对象。结合这两个事实可以解决您的问题
var递延=[];
$.each(groupedStats,函数(index,stat){
推(
//无成功处理程序-不希望触发延迟对象
$.ajax({
url:“/some/url”,
数据:{stat:stat},
类型:“POST”
})
);
});
//无法传递文字数组,请使用apply。
$.when.apply($,延迟)。然后(函数(){
//做你成功的事情
}).fail(函数(){
//可能想抓住失败
}).always(函数(){
//如果你想做同样的事情,也可以使用always
//无论调用成功还是失败
});
请注意,这不是竞争条件。虽然$.ajax是异步的,但$.each不是异步的,因此您的延迟列表将是到达$.when和$.then/$.fail/$之前的总列表。只有在它们全部完成后才会触发
编辑:我忘了添加5s分割,但这说明了总体思路。您可能可以从这里了解如何将其应用于您的问题。顺便说一句,您可以使用array.splice(0,5)若要从数组中获取下5个结果,..splice可以安全使用;如果元素总数少于5,它将只获取所有剩余元素