"infinite" 设置间隔函数 "timing out"
"infinite" setinterval function "timing out"
有一个我无法弄清楚的有点奇怪的问题。我设置了一个 javascript 计时器,它所做的只是每秒重复一个时间间隔,检查两个日期之间的差异并显示结果。一切似乎都很好,但是当让浏览器打开几分钟(不碰它.. 真的走了一会儿)时,它似乎 "time out" 并停止运行。没有控制台错误消息或任何东西,代码只是停止执行。想知道是否有人知道是什么原因造成的?是我的代码有问题还是这是一个内置的浏览器功能,如果在特定时间内用户在页面上没有输入,它会停止 js 功能?
edit 抱歉应该提到这个计时器目前设置为 运行 大约 40 天,所以它永远不会在用户会话中实际满足 clearinterval 语句。我添加到函数中的未来日期变量是来自 PHP 的动态 unix 时间戳,用于未来大约 40 天的日期。当前设置为 1444761301.88
function MModeTimer(futureDate) {
zIntervalActive = true;
var currentTime = new Date().getTime() / 1000;
var timeRemaining = futureDate - currentTime;
var minute = 60;
var hour = 60 * 60;
var day = 60 * 60 * 24;
var zDays = Math.floor(timeRemaining / day);
var zHours = Math.floor((timeRemaining - zDays * day) / hour);
var zMinutes = Math.floor((timeRemaining - zDays * day - zHours * hour) / minute);
var zSeconds = Math.floor((timeRemaining - zDays * day - zHours * hour - zMinutes * minute));
if (zSeconds <= 0 && zMinutes <= 0) {
console.log("timer in negative");
// timer at zero
clearInterval(zTimeInterval);
} else {
if (futureDate > currentTime) {
console.log("timer interval running");
// changes html as part of function
}
}
}
zTimeInterval = setInterval(function() {
MModeTimer(zNewTime)
}, 1000);
这一行:
clearInterval(zTimeInterval);
正在清空区间时的条件:
if (zSeconds <= 0 && zMinutes <= 0) {
是遇见了。
根据您在里面写的日志,那是错误的。你在检查zSeconds和zMinues是否小于等于0。所以当两者都为0时,间隔将被清除。
编辑
根据您的编辑和解释,我可以建议添加一个我不在任何条件下的控制台日志吗?:
function MModeTimer(futureDate) {
console.log('running');
//... rest of your code
这样你就可以确定间隔是否为运行,也许你的条件在一段时间后不成立,你不会看到任何日志,但间隔仍然是运行.
有一个我无法弄清楚的有点奇怪的问题。我设置了一个 javascript 计时器,它所做的只是每秒重复一个时间间隔,检查两个日期之间的差异并显示结果。一切似乎都很好,但是当让浏览器打开几分钟(不碰它.. 真的走了一会儿)时,它似乎 "time out" 并停止运行。没有控制台错误消息或任何东西,代码只是停止执行。想知道是否有人知道是什么原因造成的?是我的代码有问题还是这是一个内置的浏览器功能,如果在特定时间内用户在页面上没有输入,它会停止 js 功能?
edit 抱歉应该提到这个计时器目前设置为 运行 大约 40 天,所以它永远不会在用户会话中实际满足 clearinterval 语句。我添加到函数中的未来日期变量是来自 PHP 的动态 unix 时间戳,用于未来大约 40 天的日期。当前设置为 1444761301.88
function MModeTimer(futureDate) {
zIntervalActive = true;
var currentTime = new Date().getTime() / 1000;
var timeRemaining = futureDate - currentTime;
var minute = 60;
var hour = 60 * 60;
var day = 60 * 60 * 24;
var zDays = Math.floor(timeRemaining / day);
var zHours = Math.floor((timeRemaining - zDays * day) / hour);
var zMinutes = Math.floor((timeRemaining - zDays * day - zHours * hour) / minute);
var zSeconds = Math.floor((timeRemaining - zDays * day - zHours * hour - zMinutes * minute));
if (zSeconds <= 0 && zMinutes <= 0) {
console.log("timer in negative");
// timer at zero
clearInterval(zTimeInterval);
} else {
if (futureDate > currentTime) {
console.log("timer interval running");
// changes html as part of function
}
}
}
zTimeInterval = setInterval(function() {
MModeTimer(zNewTime)
}, 1000);
这一行:
clearInterval(zTimeInterval);
正在清空区间时的条件:
if (zSeconds <= 0 && zMinutes <= 0) {
是遇见了。
根据您在里面写的日志,那是错误的。你在检查zSeconds和zMinues是否小于等于0。所以当两者都为0时,间隔将被清除。
编辑
根据您的编辑和解释,我可以建议添加一个我不在任何条件下的控制台日志吗?:
function MModeTimer(futureDate) {
console.log('running');
//... rest of your code
这样你就可以确定间隔是否为运行,也许你的条件在一段时间后不成立,你不会看到任何日志,但间隔仍然是运行.