【发布时间】:2017-07-21 08:57:50
【问题描述】:
我的网站上有几个 div,我想一一更新。为了不一次向服务器发送超过 200 个请求的垃圾邮件,我希望每个请求延迟 1 秒。
我尝试了什么:
var $tourBox = $('.tour-box');
$tourBox.each(function () {
var $box = $(this);
setTimeout(function () {
getUpdate($box);
}, 1000);
});
更新函数:
function getUpdate($box) {
var $so = $box.attr('data-so');
var $url = $('#ajax-route-object-status').val();
$.get($url, {
so: $so
}).success(function (data) {
var $bg = 'bg-gray';
if (data.extra.isStarted === true && data.extra.isFinished === false) {
$bg = 'bg-orange'
}
if (data.extra.isStarted === true && data.extra.isFinished === true) {
$bg = 'bg-green'
}
if (data.extra.isLate === true && data.extra.isFinished === false) {
$bg = 'bg-red'
}
$box.removeClass('bg-gray').removeClass('bg-green').removeClass('bg-orange').removeClass('bg-red').addClass($bg);
});
}
在 Chrome Dev--> Network 中,它显示所有已加载为待处理,然后一一加载,但没有延迟:
如您所见,在 3907 和 3940 之间,只有半秒的延迟。即使我的超时时间为 5000,这也不会改变。
【问题讨论】:
-
你是什么意思'每个 1s。'?您的意思是每个请求都会以一秒的间隔发出,还是所有请求都将在 1 秒后发出?因为这就是你的代码正在做的事情。
setTimeout不会暂停 javascript 的执行。您的代码正在做的是在一秒钟后设置所有获取请求 -
它按预期工作的回调应该是这样工作的。请查看prashantb.me/javascript-call-stack-event-loop-and-callbacks 以更好地了解回调函数的工作原理。
标签: javascript jquery ajax get settimeout