2016-01-20 120 views
2

所以我有一个计时器,一个javascript代码和一个php文件,我的php文件只是在服务器端生成一个代码。关于javascript延迟

我的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

试试这个:'setTimeout(function(){$('。code')。before(msg);},3000)' – Rayon

+0

我认为你会混淆一些东西。你能向我们展示代码发布的代码吗?我想了解你如何设置'时间'。它目前所说的:如果时间== 1,然后等待3秒(并在等待时不做任何事情),然后执行ajax调用 –

+0

好吧,我只是编辑代码。应该更具体。 –

回答

0

它等待3秒钟,然后从generate.php得到答复,它更有可能是缓存问题。

如果您的网站启用了服务器端缓存,它将发送“旧”php生成的输出而不是新的。

附加越来越多的或tinestamp到URL像

"generate.php?v="+Date.now, 

要强制服务器始终执行PHP代码,并寄给您的当前版本。

+0

)问题是,脚本大部分工作正常,但很少搞乱了,我真的认为它是计时问题,因为generate.php创建了一个新的代码,所以JS立即运行它,generate.php创建每2分钟一个代码,如果出现错误,我发布了整个代码 –

1

你可以试试你的Ajax请求中设置cachefalse: -

$.ajax({ 
    type: "GET", 
    url: "generate.php", 
    cache: false, 
    success: function(msg) { 
     $('.code').before(msg); 
    } 
}); 

API

缓存(默认值:true,false为的dataType '脚本' 和 'JSONP')

类型:布尔型

如果设置为false,则会强制请求的页面不被 浏览器缓存。注意:将缓存设置为false仅适用于 HEAD和GET请求。它通过将“_ = {timestamp}”附加到 GET参数来工作。其他类型的 请求不需要此参数,除了在IE8中对POST请求已由GET请求的已有 的URL时。

+0

不错,不知道这也是可以的。比手工做得更好:)(+1) –

+0

刚刚试过它,也没有帮助。正如我所说,我真的认为这是时间问题。 Generate.php是一个包含相同信息的文件,直到它再次运行。而且js代码很早就调用它。所以它会显示最旧的那个,然后它会生成最新的一个。因为生成一个新代码并在同一秒内运行它,所以我不知道该怎么做,因为超时功能不能正常工作。 :( –