所以我有一个计时器,一个javascript代码和一个php文件,我的php文件只是在服务器端生成一个代码。
我的JS代码在我的计时器达到1秒后运行代码。
timeleft = 120,
ms = 1000;
var timerinterval;
var socket = io.connect('http://x:3333');
if ($('.run #timeleft').size() > 0) {
socket.on('timer', function(data) {
timeleft = data.timeleft;
if (timeleft == 1) {
setTimeout(function() {
$.ajax({
type: "GET",
url: "generate.php",
success: function(msg) {
$('.code').before(msg);
}
});
}, 3500);
}
});
setInterval(updatetimer, 1);
}
function updatetimer() {
var n = 99 - Math.round((new Date()).getMilliseconds() / 10);
if (timeleft == 120) {
n = 0;
}
if (n < 0) {
n = 0;
}
if (timeleft <= 0) {
n = 0;
}
if (timeleft < 0) {
timeleft = 0;
}
$('.run #timeleft').html(timeleft + ((n < 10) ? '.0' : '.') + n);
}
但问题是有时我的JS代码会推送旧生成的代码。所以我在这里有时间问题。
正如我所分析的那样,超时函数在超时之前从generate.php获取代码,但它在3秒后运行代码。所以这会导致错误。应该有的逻辑是,在3秒后从generate.php获取代码,而不是像获取它并等待3秒钟推送它。
我需要的是在3秒后获取generate.php代码,以确保它不会再次获取旧生成的代码。
答案 0 :(得分:1)
您可以尝试在ajax请求中设置cache
false
: -
$.ajax({
type: "GET",
url: "generate.php",
cache: false,
success: function(msg) {
$('.code').before(msg);
}
});
缓存(默认值:true,false表示dataType&#39;脚本&#39;和&#39; jsonp&#39;)
类型:布尔值
如果设置为false,则会强制请求的页面不被缓存 浏览器。注意:将缓存设置为false只能正常使用 HEAD和GET请求。它的工作原理是附加&#34; _ = {timestamp}&#34;到了 GET参数。其他类型的参数不需要 请求,但在IE8中,对已经存在的URL进行POST时除外 GET请求。
答案 1 :(得分:0)
在收到来自generate.php
的回复之前会等待3秒。您更有可能遇到缓存问题。
如果您的网站启用了服务器端缓存,它将发送“旧的”php生成的输出而不是新的输出。
向网址添加越来越多的数字或tinestamp,如
"generate.php?v="+Date.now,
强制服务器始终执行php代码并向您发送当前版本。