2013-08-06 49 views
1

現在已經過了整整一天,我似乎無法解決這個問題。是否有可能更新函數內的間隔計時器?

我在爲我的網站工作,我只需要知道如何在自己的時間間隔內從IF語句更改間隔計時器。

間隔將檢查$ .post是否有錯誤,如果有錯誤,它將顯示第一個系統錯誤。 (以及增加另一個變量以進行錯誤#2

3秒鐘後,將顯示錯誤#2,這正是我想要的,但間隔持續保持在3秒,並且無論如何不工作我做的。

_staffIntervalID = 3000; 
serverError = 0; 

staffMsg = setInterval(function() { 

     if(isInChat == true) { 
     $.post('./slivechat.php', {staff:"true"}, function(data) { 
     if(data == "") return; 

     $('#display_msg').append(+ nl2br(data) + "<br />"); 
     $('#display_msg').animate({scrollTop: $(document).height()}, 'slow'); 

     }) 
       .error(function() { 
       serverError++; 

       if(serverError == 1) { 
       $('#display_msg').append("<span style='color: red;'>System</span>: An error occured whilst we tried to fetch staff response. Please wait while I try to fix the this problem.<br />"); 
       _staffIntervalID = 12000; 
       } else if(serverError == 2) { 
       $('#display_msg').append("<span style='color: red;'>System</span>: There seems to be an error, please check your conection. Or wait a few more seconds for the final verdict.<br />"); 
       _staffIntervalID = 24000; 
       } else if(serverError >= 3) { 
       $('#display_msg').append("<span style='color: red;'>System</span>: Due to technical difficulties we are closing this chat. Please try again later! <br />"); 
       clearInterval(staffMsg); 
       } 

     $('#display_msg').animate({scrollTop: $(document).height()}, 'slow'); 
     console.log("ServerError: " + serverError + " timer: " + _staffIntervalID); 
     }); 
     } 

    }, _staffIntervalID); 

即使在CONSOLE.LOG它表明計時器發生了變化,但它一直在更新每隔3

真的希望我能得到這個儘快解決!

PS-的Javascript不是我的主要語言,PHP是。所以如果你有一個修復,請嘗試舉一個例子。

+3

使用setTimeout而不是setInterval並根據您的條件更改持續時間。 – Virus721

回答

1

我建議不使用匿名功能並重置計時器

serverError = 0; 

var staffMsg = setInterval(CheckError, 3000); 
function CheckError() { 

    if (isInChat == true) { 
     $.post('./slivechat.php', { 
      staff: "true" 
     }, function (data) { 
      if (data == "") return; 

      $('#display_msg').append(+nl2br(data) + "<br />"); 
      $('#display_msg').animate({ 
       scrollTop: $(document).height() 
      }, 'slow'); 

     }) 
      .error(function() { 
      serverError++; 

      if (serverError == 1) { 
       $('#display_msg').append("<span style='color: red;'>System</span>: An error occured whilst we tried to fetch staff response. Please wait while I try to fix the this problem.<br />"); 
       clearTimeout(staffMsg); 
       staffMsg = setInterval(CheckError, 12000); 
      } else if (serverError == 2) { 
       $('#display_msg').append("<span style='color: red;'>System</span>: There seems to be an error, please check your conection. Or wait a few more seconds for the final verdict.<br />"); 
       clearTimeout(staffMsg); 
       staffMsg = setInterval(CheckError, 24000); 
      } else if (serverError >= 3) { 
       $('#display_msg').append("<span style='color: red;'>System</span>: Due to technical difficulties we are closing this chat. Please try again later! <br />"); 
       clearInterval(staffMsg); 
      } 

      $('#display_msg').animate({ 
       scrollTop: $(document).height() 
      }, 'slow'); 
      console.log("ServerError: " + serverError + " timer: " + _staffIntervalID); 
     }); 
    } 

} 
+0

你的代碼工作,謝謝! :) – DharmeshPHP

+0

不客氣,很高興提供幫助 – Smeegs

2

不,你不能改變間隔時間。

但你能做到這樣,而不是:

var _staffIntervalID = 3000; 
setTimeout(function() { 
    // your code here 
    setTimeout(arguments.callee,_staffIntervalID); 
},_staffIntervalID); 
+0

對不起,哥們,但是那段代碼讓我很困惑:$。我不是故意要求餵食勺子,但是你可能有點特別嗎? 「setTimeout(arguments.callee,_staffIntervalID);」在setTime()內很困惑我。 – DharmeshPHP

+0

'arguments.callee'指的是當前函數。在這種情況下,正在傳遞給超時的函數。有了這個,你可以更新'_staffIntervalID'變量,它會更新間隔。 –

0

其實setInterval的方法不會被剛剛正在重置定時器的值改變定時器的值。

你應該做的是明確的計時器和使用功能名稱作爲您的功能就像一個參考:

var delay = 1000, now = new Date().valueOf(); 
var timer = setInterval(function loop() 
{ 
    console.log(now - new Date.valueOf()); 

    delay += 1000; 
    clearInterval(timer); 
    timer = setInterval(loop, delay); 

}, delay); 

或(與超時):

var delay = 1000, now = new Date().valueOf(); 
var timer = setTimeout(function loop() 
{ 
    console.log(now - new Date.valueOf()); 

    delay += 1000; 
    timer = setTimeout(loop, delay); 

}, delay); 

注意,把一個在計時器中調用ajax可能是個好主意。您應該等待響應再次打電話。

+0

嗯...不是每次都清除間隔並設置一個新的...就像設置一個新的超時一樣? –

+0

arguments.calle不是標準的,最好命名匿名函數,並通過名稱 – user1549458

+0

執行它,謝謝你指出這個 –

0

即使你改變變量_staffIntervalID並不意味着setInterval的是不會改變,以使其工作,你需要做一個clearInterval並用新值運行一個新的setInterval

相關問題