Javascript 延迟jqueryajax For循环

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

我在循环中的ajax请求之间存在延迟问题。 我想让脚本等待7秒来做下一个。请求不完全相同,我不知道有多少请求可以相同。

$(文档).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);
            }
        });
    })    
}