在For循环中延迟jQuery Ajax

时间:2017-10-03 08:56:10

标签: javascript jquery ajax settimeout delay

我有问题在循环中的ajax请求之间造成延迟。 我希望脚本等待7秒才能完成下一个。请求不完全相同,我不知道有多少请求。

$(document).ready(function () {
    var announce = $("#announce").data('id');
    var lots_cnt = parseInt($("#announce").data('lotscnt'));
    for (var i = 0; i < Math.ceil(lots_cnt/20); i++) {
        $.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();
                    setTimeout(function() { $("#console").append("Waiting 7 sec ...<br/>"); }, 7000);
                },
                error:function(jqXHR,  textStatus,  errorThrown){

                }
            });
    };

});

2 个答案:

答案 0 :(得分:1)

这是一个很棒的问题!

我看到你正在使用jQuery .ajax。根据{{​​3}},SELECT a.emp_num , b.NAME, COUNT(*) AS 'Num of days', SUM(CASE WHEN Shift_id=14 THEN 1 ELSE 0 END ) as 'Number of days with Shift id 14' from Overtime a INNER JOIN Employee b ON a.emp_num = b.emp_num WHERE a.dep_code = 305 AND trans_date BETWEEN '2017-9-1' AND '2017-9-30' and over_time >= '02:00:00.0000000' GROUP BY a.emp_num ,b.NAME 现在返回一个承诺。我们可以用承诺来实现你想要的东西。

首先,在你的for循环$.get()中,你要做的第一件事就是运行for (var i = 0; i < Math.ceil(lots_cnt/20); i++) {。而不是那样,我们要做的是构建一个函数数组,其中每个函数都返回一个promise。

$.ajax

然后,你将编写一个递归(ish)函数来处理每个函数,当前一个函数完成时(如果你愿意,可以在超时后)

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);
}

---编辑--- 以下是您如何将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(); 转变为承诺:

$.ajax

答案 1 :(得分:0)

您可以使用map代替for进行修复。

如果使用地图,您可以更改异步设置true

在处理异步处理时,最好使用map而不是for语句。