Javascript 两个定时器的同步(设置间隔)

Javascript 两个定时器的同步(设置间隔),javascript,jquery,setinterval,Javascript,Jquery,Setinterval,我正在使用一个脚本,其中包含一个函数,需要每10分钟调用一次。另外,为了告知用户在重新加载函数之前还剩多少时间(通过AJAX,但这与现在无关),我设置了一个小的回归计时器 这是主要结构: $(document).ready(function () { // Test's function function loadDate() { var myDate = new Date(); $("#dateload").html(myDate);

我正在使用一个脚本,其中包含一个函数,需要每10分钟调用一次。另外,为了告知用户在重新加载函数之前还剩多少时间(通过AJAX,但这与现在无关),我设置了一个小的回归计时器

这是主要结构:

$(document).ready(function () {

    // Test's function
    function loadDate() {
        var myDate = new Date();
        $("#dateload").html(myDate);
    };

    // Startup Variables
    countermin = 10; // 10 minutes
    countersec = 60;
    minpass = 0;
    secpass = 0

    // Showing info before timer.
    $("#reloadtime").html("Function will be reloaded in " + countermin + "m<b>" + (60 - countersec) + "</b>s<br/>(countersec's value: " + countersec + " - secpass' value: " + secpass + ")");
    $("#timescalled").text("The date function has been called " + minpass + " times  after page's load.");

    loadDate();


    // FIRST setInterval
    // It's our timer.
    intvl1 = setInterval(function () {
        if (countersec++ == 60) {
            countermin--;
            countersec = 1;
        }

        if (countermin < 0) {
            countermin = 9;
            countersec = 1;
            secpass = 0;
        }

        secpass++;

        $("#reloadtime").html("Function will be reloaded in " + countermin + "m<b>" + (60 - countersec) + "</b>s<br/>(countersec's value: " + countersec + " - secpass' value: " + secpass + ")");

    }, 1000);

    // SECOND setInterval
    // Counting 10 minutes to execute the function again (and again...).        
    intvl2 = setInterval(function () {

        minpass++;
        $("#minpass").text("The date function has been called " + minpass + " times after page's load.");
        loadDate();

    }, 600000);

});
$(文档).ready(函数(){
//测试函数
函数loadDate(){
var myDate=新日期();
$(“#dateload”).html(myDate);
};
//启动变量
countermin=10;//10分钟
countersec=60;
minpass=0;
secpass=0
//显示定时器前的信息。
$(“#reloadtime”).html(“函数将在”+countermin+“m”+(60-countersec)+“s
(countersec的值:“+countersec+”-secpass的值:“+secpass+”)中重新加载”); $(“#timescalled”).text(“页面加载后,日期函数已被调用“+minpass+”次。”); loadDate(); //第一设定间隔 //这是我们的计时器。 intvl1=设置间隔(函数(){ 如果(计数器+==60){ 反敏--; countersec=1; } 如果(计数器最小值<0){ 计数器最小值=9; countersec=1; secpass=0; } secpass++; $(“#reloadtime”).html(“函数将在”+countermin+“m”+(60-countersec)+“s
(countersec的值:“+countersec+”-secpass的值:“+secpass+”)中重新加载”); }, 1000); //第二设定间隔 //计算10分钟以再次执行该功能(一次又一次…)。 intvl2=设置间隔(函数(){ minpass++; $(“#minpass”).text(“页面加载后,日期函数已被调用“+minpass+”次。”); loadDate(); }, 600000); });
我的问题是:两个计时器都不同步。
intvl2
正在执行该函数,并在计时器(
intvl1
)达到0之前返回。误差约为20秒,每10分钟后增加一次

如果您将开始时打印的时间(大约6、7分钟的执行时间)与PC时钟进行比较,您可以看到时间上的差异

如何使它们同步


您可以检查。

一种更简单的方法是使用一个计时器来完成这两项工作,更新倒计时信息并触发事件。以下是一个例子:

var oneSecond = 1000;
var counter = 0;

var eventInterval = 5 * oneSecond;
var timesTriggered = 0;

setInterval(function () {

    counter = (counter + oneSecond) % eventInterval;
    $('.countdown').text((eventInterval - counter) / oneSecond);

    if(counter == 0){
        timesTriggered++;
        $('.timesTriggered').text(timesTriggered);
    }

}, oneSecond);

工作提琴:

一种更简单的方法是使用一个计时器来完成这两项工作,更新倒计时信息并触发事件。以下是一个例子:

var oneSecond = 1000;
var counter = 0;

var eventInterval = 5 * oneSecond;
var timesTriggered = 0;

setInterval(function () {

    counter = (counter + oneSecond) % eventInterval;
    $('.countdown').text((eventInterval - counter) / oneSecond);

    if(counter == 0){
        timesTriggered++;
        $('.timesTriggered').text(timesTriggered);
    }

}, oneSecond);

工作提琴:

我对你的代码进行了一点修改-我不能坐下来倒数10分钟:)所以我把它改成了一分钟,并做了一些其他的修改,但这样做很好,不会浪费时间

$(document).ready(function () {
// Function of Test
function loadDate() {
    var myDate = new Date();
    $("#dateload").html(myDate);
};

countersec = 60; //
minpass = 0;

$("#reloadtime").html("Function will be reloaded in "+countersec+"</b>s<br/>");
$("#timescalled").text("The date function has been called " + minpass + " times after page's load.");
loadDate();

intvl1 = setInterval(function () {
    countersec--;
    if (!countersec) { countersec=60; }
    $("#reloadtime").html("Function will be reloaded in "+countersec+"</b>");
}, 1000);

intvl2 = setInterval(function () {

    minpass++;
    $("#minpass").text("The date function has been called " + minpass + " times after page's load.");
    loadDate();

}, 60000);

});
$(文档).ready(函数(){
//测试功能
函数loadDate(){
var myDate=新日期();
$(“#dateload”).html(myDate);
};
countersec=60//
minpass=0;
$(“#reloadtime”).html(“函数将在“+counterc+”s
”中重新加载); $(“#timescalled”).text(“页面加载后,日期函数已被调用“+minpass+”次。”); loadDate(); intvl1=设置间隔(函数(){ 反击--; 如果(!counterc){counterc=60;} $(“#reloadtime”).html(“函数将在“+countersec+”中重新加载”); }, 1000); intvl2=设置间隔(函数(){ minpass++; $(“#minpass”).text(“页面加载后,日期函数已被调用“+minpass+”次。”); loadDate(); }, 60000); });
我对你的代码进行了一些修改-我不能坐在那里等待10分钟倒计时:)所以我把它改为1分钟,并做了一些其他更改,但这很好,而且不会浪费时间

$(document).ready(function () {
// Function of Test
function loadDate() {
    var myDate = new Date();
    $("#dateload").html(myDate);
};

countersec = 60; //
minpass = 0;

$("#reloadtime").html("Function will be reloaded in "+countersec+"</b>s<br/>");
$("#timescalled").text("The date function has been called " + minpass + " times after page's load.");
loadDate();

intvl1 = setInterval(function () {
    countersec--;
    if (!countersec) { countersec=60; }
    $("#reloadtime").html("Function will be reloaded in "+countersec+"</b>");
}, 1000);

intvl2 = setInterval(function () {

    minpass++;
    $("#minpass").text("The date function has been called " + minpass + " times after page's load.");
    loadDate();

}, 60000);

});
$(文档).ready(函数(){
//测试功能
函数loadDate(){
var myDate=新日期();
$(“#dateload”).html(myDate);
};
countersec=60//
minpass=0;
$(“#reloadtime”).html(“函数将在“+counterc+”s
”中重新加载); $(“#timescalled”).text(“页面加载后,日期函数已被调用“+minpass+”次。”); loadDate(); intvl1=设置间隔(函数(){ 反击--; 如果(!counterc){counterc=60;} $(“#reloadtime”).html(“函数将在“+countersec+”中重新加载”); }, 1000); intvl2=设置间隔(函数(){ minpass++; $(“#minpass”).text(“页面加载后,日期函数已被调用“+minpass+”次。”); loadDate(); }, 60000); });
应为“counterce=1;”不是计数器=0?您正在向它添加1,测试它是否==60,如果是,则设置为1-当然是0?主计时器每分钟会损失你一秒钟。我个人会设置一个倒计时,从600开始,然后每秒钟递减一次。你可以很容易地将其转换为分秒显示,节省了大量代码。温莎,我在这里想,如果我每分钟损失1秒,我将在10分钟后损失10秒,而不是20秒。然而,当你看小提琴时,你可以看到10分钟变为600秒(在
secpass
上感知)。所以,使用你所说的另一个概念(这很聪明!)也会导致同样的事情=\使用两个独立的计时器注定会失败。为了记录在案,我也会使用单计时器的方法。我想对您的代码进行最少的编辑,但这是一种过于复杂的方法,应该是'counterce=1;'不是计数器=0?您正在向它添加1,测试它是否==60,如果是,则设置为1-当然是0?主计时器每分钟会损失你一秒钟。我个人会设置一个倒计时,从600开始,然后每秒钟递减一次。你可以很容易地将其转换为分秒显示,节省了大量代码。温莎,我在这里想,如果我每分钟损失1秒,我将在10分钟后损失10秒,而不是20秒。然而,当你看小提琴时,你可以看到10分钟变成600秒(在
secpas上感知)