2013-08-06 26 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

相关问题