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