Javascript 延迟jqueryajax For循环
我在循环中的ajax请求之间存在延迟问题。 我想让脚本等待7秒来做下一个。请求不完全相同,我不知道有多少请求可以相同。Javascript 延迟jqueryajax For循环,javascript,jquery,ajax,settimeout,delay,Javascript,Jquery,Ajax,Settimeout,Delay,我在循环中的ajax请求之间存在延迟问题。 我想让脚本等待7秒来做下一个。请求不完全相同,我不知道有多少请求可以相同。 $(文档).ready(函数(){ var annound=$(“#annound”).data('id'); var lots_cnt=parseInt($(“#宣布”).data('lotscnt'); 对于(var i=0;i
$(文档).ready(函数(){
var annound=$(“#annound”).data('id');
var lots_cnt=parseInt($(“#宣布”).data('lotscnt');
对于(var i=0;i解析来自页面“+(i+1)+”的批次…
”;
},
完成:函数(){
},
成功:功能(m){
$(“#控制台”)。追加(m);
addprogressstep();
setTimeout(函数(){$(“#控制台”).append(“等待7秒…
”);},7000);
},
错误:函数(jqXHR、textStatus、errorshown){
}
});
};
});
这是一个很棒的问题
我看到您正在使用jQuery.ajax。根据,$.get()
现在返回一个承诺。我们可以用承诺来实现你想要的
首先,在for循环中,for(var i=0;i
,您要做的第一件事是运行$.ajax
var funcArray = [];
// EDIT changed var i to let i
for (let i = 0; i < Math.ceil(lots_cnt/20); i++) {
var getFunction = function(){
var getPromise = $.get(...);
return getPromise;
}
funcArray.push(getFunction);
}
---编辑---
以下是如何将$.ajax
变成承诺:
function ajx(i) {
return new Promise(function(resolve, reject){
$.ajax({
method: "GET",
url: "/project/lots/"+announce+"/"+(i+1),
async: false,
beforeSend: function () {
$("#console").append("<strong>Parsing lots from page "+(i+1)+"...</strong><br/>");
},
complete:function(){
},
success: function (m) {
$("#console").append(m);
addprogressstep();
resolve(m);
},
error:function(jqXHR, textStatus, errorThrown){
reject(jqXHR, textStatus, errorThrown);
}
});
})
}
函数ajx(i){
返回新承诺(功能(解决、拒绝){
$.ajax({
方法:“获取”,
url:“/project/lots/”+公布+“/”+(i+1),
async:false,
beforeSend:函数(){
$(“#控制台”).append(“解析来自页面“+(i+1)+”的批次…
”;
},
完成:函数(){
},
成功:功能(m){
$(“#控制台”)。追加(m);
addprogressstep();
决议(m);
},
错误:函数(jqXHR、textStatus、errorshown){
拒绝(jqXHR、textStatus、errorboorn);
}
});
})
}
您可以使用map
而不是来修复
如果使用map,您可以更改异步设置true
在处理异步处理时,最好使用map而不是for语句。。也就是说,如果可以避免的话,发送那么多AJAX请求不是一个好主意。如果可能的话,我建议在一个请求中发送所有数据。但是,您一定要删除
async:false
,因为这太可怕了练习-如果你检查控制台,你甚至会看到浏览器告诉你不要使用它。它不像看上去那么多请求,它在1到6之间,所以我认为浏览器和网络在这方面很好。不幸的是,我不能用一个请求代替这个循环,我需要这个延迟来避免“429太多请求”错误。浏览器对此没有问题,但是如果您每分钟有N个用户*N个请求被发送到服务器,那么您的服务器/托管公司可能不会有问题。@ГббГаааПааааааааknow@TKoL谢谢你提供的帮助,非常感谢。你给了我一个解决我问题的方法。我来描述一下在你的答案下面是我的解决方案。谢谢你,我没有考虑递归。你的代码对我不起作用,它一直试图用I=6从funcArray执行函数。所以我这样做:var lots\u cnt=parseInt($(“#宣布”).data('lotscnt');var pages=Math.ceil(lots\u cnt/20);var currentPage=1;function runNext(){$.get(“/goszakup/lots/”+announce+“/”+currentPage,函数(m){$(“#console”).append(m);addprogressstep();currentPage++;if(currentPageAh是的,当你用clojures以这种方式循环时,变量“i”总是以最大的值结束。我没有想到这一点。@ΓббΓааааПаПаааааааПаа1072。
function runNext(){
if (funcArray.length > 0) {
var nextFunction = funcArray.shift();
nextFunction() // this is our $.get promise
.then(function(resultOfGet){
// do something with your result
setTimeout(runNext,1000*7);
})
}
}
runNext();
function ajx(i) {
return new Promise(function(resolve, reject){
$.ajax({
method: "GET",
url: "/project/lots/"+announce+"/"+(i+1),
async: false,
beforeSend: function () {
$("#console").append("<strong>Parsing lots from page "+(i+1)+"...</strong><br/>");
},
complete:function(){
},
success: function (m) {
$("#console").append(m);
addprogressstep();
resolve(m);
},
error:function(jqXHR, textStatus, errorThrown){
reject(jqXHR, textStatus, errorThrown);
}
});
})
}