2016-01-20 116 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代碼很早就調用它。所以它會顯示最舊的那個,然後它會生成最新的一個。因爲生成一個新代碼並在同一秒內運行它,所以我不知道該怎麼做,因爲超時功能不能正常工作。 :( –