Javascript 是否可以在功能内更新间隔计时器?

Javascript 是否可以在功能内更新间隔计时器?,javascript,setinterval,Javascript,Setinterval,已经一整天了,我似乎仍然无法解决这个问题 我正在为我的网站做一个项目,我只需要知道如何在间隔时间内从IF语句更改间隔计时器 间隔将检查$.post是否有错误,如果有,将显示第一个系统错误。(以及增加另一个变量以继续执行错误#2 3秒后,将显示错误#2。这正是我想要的。但是,间隔一直保持在3秒,无论我做什么,它都不起作用 _staffIntervalID = 3000; serverError = 0; staffMsg = setInterval(function() {

已经一整天了,我似乎仍然无法解决这个问题

我正在为我的网站做一个项目,我只需要知道如何在间隔时间内从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); 
\u staffIntervalID=3000;
serverError=0;
staffMsg=setInterval(函数(){
如果(isInChat==true){
$.post('./slivechat.php',{staff:“true”},函数(数据){
如果(数据==“”)返回;
$('#display_msg')。追加(+nl2br(数据)+“
”; $('#display_msg')。动画({scrollTop:$(document.height()},'slow'); }) .错误(函数(){ serverError++; if(serverError==1){ $(“#display_msg”).append(“系统:我们试图获取员工响应时出错。请稍候,我正在尝试解决此问题。
”; _staffIntervalID=12000; }else if(serverError==2){ $(“#display_msg”).append(“系统:似乎有错误,请检查您的连接。或者再等几秒钟,等待最终裁决。
”; _staffIntervalID=24000; }如果(serverError>=3){ $(“#display_msg”).append(“系统:由于技术问题,我们正在关闭此聊天。请稍后再试!
); clearInterval(staffMsg); } $('#display_msg')。动画({scrollTop:$(document.height()},'slow'); log(“ServerError:+ServerError+”计时器:++\u staffIntervalID); }); } },_staffinintervalid);
即使在console.log上,它也显示计时器已更改,但它会每3次更新一次

真希望我能很快把这个修好


Ps-Javascript不是我的主要语言,PHP是。因此,如果您有解决方案,请尝试给出一个示例。

不,您不能更改间隔时间

但你可以这样做:

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

实际上,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);
或(带超时):


请注意,将ajax调用放入计时器可能是一个好主意。您应该等待响应再次调用。

即使更改变量,也不意味着setInterval将更改,为了使其工作,您需要执行clearInterval并使用新值运行新的setInterval

,我建议请不要使用匿名函数并重置计时器

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);
        });
    }

}
serverError=0;
var staffMsg=设置间隔(检查错误,3000);
函数检查错误(){
如果(isInChat==true){
$.post('./slivechat.php'{
工作人员:“真的”
},函数(数据){
如果(数据==“”)返回;
$('#display_msg')。追加(+nl2br(数据)+“
”; $('#display_msg')。设置动画({ scrollTop:$(文档).height() }“慢”); }) .错误(函数(){ serverError++; if(serverError==1){ $(“#display_msg”).append(“系统:我们试图获取员工响应时出错。请稍候,我正在尝试解决此问题。
”; clearTimeout(staffMsg); staffMsg=设置间隔(检查错误,12000); }else if(serverError==2){ $(“#display_msg”).append(“系统:似乎有错误,请检查您的连接。或者再等几秒钟,等待最终裁决。
”; clearTimeout(staffMsg); staffMsg=setInterval(检查错误,24000); }否则如果(服务器错误>=3){ $(“#display_msg”).append(“系统:由于技术问题,我们正在关闭此聊天。请稍后再试!
); clearInterval(staffMsg); } $('#display_msg')。设置动画({ scrollTop:$(文档).height() }“慢”); log(“ServerError:+ServerError+”计时器:++\u staffIntervalID); }); } }
使用setTimeout而不是setInterval,并根据您的情况更改持续时间。抱歉,伙计,但这段代码让我有点困惑:$。我不是想请求填鸭式喂食,但您能说得具体一点吗?setTime()内的“setTimeout(arguments.callee,_staffIntervalID);”我很困惑。
参数。被调用方
指的是当前函数。在本例中,传递给超时的函数。使用此函数,您只需更新
\u staffIntervalID
变量,它就会更新间隔。嗯…不是每次都清除间隔并设置一个新的间隔…与设置相同新的timeout?arguments.calle不是标准的,最好命名匿名函数并按名称执行它
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);
        });
    }

}