javascript - Ajax 中的计时器 - 抢占
问题描述
所以这件事在我的脑海中持续了很长时间,无论是在 AJAx 中给出的计时器之后它必须发送另一个请求,如果它小于请求的文件完成其操作所花费的实际时间怎么办。
例如,考虑下面的代码,
<div class="item"></div>
<script>
function timeLeft() {
$(".item").each(function() {
$this = $(this);
var dataString = {s: "//some data", st: "<?echo $stamp?>"};
$.ajaxSetup({cache:false});
$.ajax({
type: "POST",
url: "get_content_home.php",
dataType: "html",
data: dataString,
success: function(result) {
$this.html(result);
}
});
});
}
window.setInterval(function() {
timeLeft();
}, 100);
</script>
此处给出的计时器为 100 毫秒,每 100 米将请求一次文件 get_content_home.php。如果 get_content_home.php 需要 500 毫秒来完成它的操作怎么办。get_content_home.php 会被抢占并再次被请求吗?还是计时器会等待并自行延迟。
提前致谢。
解决方案
由于 ajax 请求处于循环状态,这比您想象的要糟糕。
实际上会发生的是:
window.setInterval
称呼timeLeft
timeLeft
get_content_home.php
为每个.item
元素调用一次 AJAX 请求。假设一个 AJAX 调用需要 500 毫秒,您将在第一个 AJAX 请求返回之前执行五次(因此
number of .item
在一个结果之前进行 5 次调用)。
要停止这种疯狂行为,请将您的 AJAX 调用放在循环之外,并将其放入window.setInterval
AJAX 回调函数中:
$.ajax({
type: "POST",
url: "get_content_home.php",
dataType: "html",
data: dataString,
success: function(result) {
$this.html(result);
window.setTimeOut(function() {
timeLeft();
}, 100);
}
});
并在开始时只调用timeLeft();
一次。
推荐阅读
- screen-scraping - 如何使用 python 语言中的 selenium 和 chromedriver 抓取此页面?
- kotlin - 如何使用 Room ``@Ignore``` 注释忽略 kotlin 委托属性
- php - 连续显示 3 个 div 中的数据
- firebase - 是否可以使用 Firebase 性能找到内存泄漏?
- kaltura - 是否可以在 kaltura 中用视频元素替换 iframe
- angular - 使用 Angular ngClass 或 ngStyle 有条件地更改剑道网格行颜色不起作用
- openssl - OpenSSL 重定位错误
- excel - 在 VBA 中使用循环选择每个工作表中的第一个可见单元格
- javascript - 每个分页单个查询?数据表.js laravel
- python - 我想防止重复的字符串输出