我有问题在循环中的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){
}
});
};
});
答案 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语句。