现在已经整整一天,我似乎无法解决这个问题。
我正在为我的网站开发一个项目,我只需要知道如何在自己的间隔内从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上,它也会显示计时器已更改,但每次更新时都会更新。
真的希望我能尽快解决这个问题!
Ps- Javascript不是我的主要语言,PHP是。因此,如果您确实有解决方案,请尝试举例说明。
答案 0 :(得分:2)
不,你不能改变间隔期。
但你可以这样做:
var _staffIntervalID = 3000;
setTimeout(function() {
// your code here
setTimeout(arguments.callee,_staffIntervalID);
},_staffIntervalID);
答案 1 :(得分: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);
});
}
}
答案 2 :(得分: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调用可能是个好主意。您应该等待响应再次呼叫。
答案 3 :(得分:0)
即使您更改变量_staffIntervalID并不意味着setInterval会发生变化,为了使其工作,您需要执行clearInterval并使用新值运行新的setInterval