javascript - 停止两个间隔同时运行

标签 javascript intervals

我正在开发一个倒计时器,这需要一个动态unix标记并将其应用到页面上的一些javascript以显示倒计时(使用简单的间隔函数)。

我设置了一个获取请求,每隔 10 秒左右发送一次以检查新数据,如果存在新数据,则应停止当前倒计时间隔,并使用新数据开始新的倒计时间隔。我设置了一个变量来在页面加载时“基于”该值,这样我就可以检测到该值何时发生变化,并在发生变化时启动一个新的间隔。

目前,每次收到新数据时,都会开始一个新的间隔,因此数字开始在屏幕上闪烁。

我不明白为什么要这样做,有什么想法吗?

// main function for checking for new data every 10 seconds 

zIntervalActive = false; // for checking if interval is active or not
  function zTime() {
        return $.ajax({
            type: 'get',
            data: "q=" + baseTime,
            url: 'clockcalculator3.php',
            success: function(results) {
                var futureUnix = Number(results);
                console.log(results + typeof(results));
                console.log(futureUnix);
                if (futureBase == futureUnix) {
                    if (zIntervalActive === false) {
                        var zTimeInterval = setInterval(function() {MModeTimer(futureUnix)}, 1000);

                }
                    else {

                    }
                }

                else {
                    clearInterval(zTimeInterval);
                    zIntervalActive = false;
                    futureBase = futureUnix;
                    var zTimeInterval = setInterval(function() {MModeTimer(futureUnix)}, 1000);

                }


            },
            complete: function(data) {

                setTimeout(zTime, interval);
            },
            error: function() {

            }
        });
    }

 //   function to "base" the value initially on page load

function zTimeStart() {
        return $.ajax({
            type: 'get',
            data: "q=" + baseTime,
            url: 'clockcalculator3.php',
            success: function(results) {
                futureBase = Number(results);
                console.log("ztime start" + results + typeof(results));
                console.log("ztime start" + futureBase);
            },                
            error: function() {

            }
        });
    }

 //   clock countdown function (fired as an interval)

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

clearInterval(zTimeInterval);


} else {

if (futureDate > currentTime) {
     $(".zdays").html(zDays);
                $(".zhours").html(zHours);
                $(".zminutes").html(zMinutes);
                $(".zseconds").html(zSeconds);

}

    }


}

最佳答案

zInterval 需要在更高级别的范围内定义,它可以在您的间隔期间持续。现在,它位于本地函数内部,并且超出了范围,并在您需要它之前被垃圾收集。

由于我在这里看不到代码的整个范围,我的猜测是将其放在 zTime() 声明之外:

zIntervalActive = false;
var zInterval;

然后,在分配 zInterval 时从 zInterval 中删除 var,以便使用之前定义的变量,而不是重新定义新的局部变量:

zTimeInterval = setInterval(...);

关于javascript - 停止两个间隔同时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32159605/

相关文章:

javascript - 如何根据路由和使用 vue-route 更改 Vue 组件中的数据对象?

javascript - 追加时出现"undefined"错误?

javascript - 隐藏 3 列并将其中一列扩展为 100% 行时的 jQuery 过渡效果

sql - 用于从时间戳中减去时间的 Oracle SQL 查询

r - 检查一系列日期是否在一系列不同的时间间隔内

使用间隔的javascript开关

mysql - 每 6 个月在一条记录中分组

javascript - 从 AngularJS 中的 View 调用 Controller 函数

javascript - CPU 对 JavaScript setInterval 的影响有多大

java - 添加到间隔集 Java 提高效率