关于javascript延迟

时间:2016-01-20 08:53:25

标签: javascript delay

所以我有一个计时器,一个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代码,以确保它不会再次获取旧生成的代码

2 个答案:

答案 0 :(得分:1)

您可以尝试在ajax请求中设置cache false: -

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

API

  

缓存(默认值: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代码并向您发送当前版本。