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 是。因此,如果您确实有解决办法,请也尝试举个例子。

4

4 回答 4

2

不,您不能更改间隔时间。

但是你可以这样做:

var _staffIntervalID = 3000;
setTimeout(function() {
    // your code here
    setTimeout(arguments.callee,_staffIntervalID);
},_staffIntervalID);
于 2013-08-06T14:00:21.013 回答
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);
        });
    }

}
于 2013-08-06T14:05:21.253 回答
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 调用放入计时器中可能是个好主意。您应该等待响应再次调用。

于 2013-08-06T14:01:29.693 回答
0

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

于 2013-08-06T14:02:48.207 回答