【发布时间】:2016-03-01 12:28:17
【问题描述】:
我有一个包含 10 张图片的页面,这些图片托管在亚马逊 aws 上,由于某种原因,检索速度非常慢等。
我现在正在尝试显示一个没有任何缩略图图像的页面,然后使用 AJAX 调用来获取它们。因此,由于 PHP 脚本中的一个特定图像“获取”周期可能需要很长时间,因此我在示例脚本中创建了一个间隔,该示例脚本最终将调用一个控制器/方法 URL,该 URL 反过来将检索正确的图像每个拇指“插槽”,基于其他一些参数、实体的 ID 等(涉及很多东西)。
我设法每 2 秒执行一次 AJAX 调用(当然基于间隔),但我不想等待整整 2 秒来获取集合中的另一个图像,例如,如果 AJAX 调用完成, 0.5 秒(浪费了 1.5 秒的纯等待时间)。
所以我想在这里弄清楚如何,当调用 jQuery ajax.done() 时,我可以“突破”这个间隔等待时间周期的等待时间,并立即进行另一个 AJAX 调用。尝试了几种方法,但徒劳无功。
HTML 和 JS:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css"/>
</head>
<body>
<ul class="thumbs">
<li><img src="images/no-image.jpg" alt="buffalo soldier"/></li>
<li><img src="images/no-image.jpg" alt="buffalo soldier"/></li>
<li><img src="images/no-image.jpg" alt="buffalo soldier"/></li>
<li><img src="images/no-image.jpg" alt="buffalo soldier"/></li>
</ul>
<script src="https://code.jquery.com/jquery-2.2.1.min.js"></script>
<script>
$(document).ready(function() {
var thumbsList = $('.thumbs'), // ul of images
// append loader image to all images that need loading
// ( if to be appended as loader image to images one by one, when ajax call is made, do this in the interval function instead )
totalImagesToFetch = thumbsList.find('li img').attr('src', 'images/loader.gif').length,
currentPosition = 0;
// kreiraj interval koji fetchuje sliku po sliku
var fetchThumbInterval = setInterval(function() {
console.log('called');
// dont call interval anymore if we fetched all the needed image thumbs
if(currentPosition >= totalImagesToFetch - 1) clearInterval(fetchThumbInterval);
fetchMeNewThumb = $.ajax({
url: "process.php",
method: "POST"
});
fetchMeNewThumb.done(function(data) {
console.log(currentPosition);
thumbsList.find('li img:eq(' + currentPosition + ')').attr( "src", data ); // String: URL for image src attribute
currentPosition++;
resetInterval(fetchThumbInterval, 2000);
});
}, 2000);
function resetInterval(intervalName, miliseconds) {
clearInterval(intervalName);
setInterval(intervalName, miliseconds);
}
});
</script>
简单的 CSS:
.thumbs li {
display: block;
}
.thumbs li img{
width: 400px;
height: 400px;
}
并且使用的图像只是网上找到的一些随机图像。附: (如果您注释掉对resetInterval()函数的调用,它会正常工作并每2秒调用一次AJAX :)
【问题讨论】:
-
通常情况下,
setInterval处理起来会很痛苦。为什么不简单地setTimeout?一个等待 2 秒来执行下一个 ajax 请求,如果当前一个提前成功,您只需清除超时并手动触发下一个请求。不要疯狂地摆弄间隔。 -
现在试试这个方法,谢谢你的建议 :)
-
哦,强迫性的投票者松散。如果您(不是您的 OT)真的认为有什么不对劲足以证明对所有三个回答这个问题的人投反对票是合理的,那么您不妨发表评论。
标签: javascript jquery html ajax