Javascript 如何正确使用setInterval和clearInterval
这是我写的代码Javascript 如何正确使用setInterval和clearInterval,javascript,Javascript,这是我写的代码 function formatDate(date) { var day; if (date.getDate() < 10) { day = "0" + date.getDate(); } else { day = date.getDate(); } var month; var tempMonth = date.getMonth() + 1; if ( tempMonth < 10){ month = "0" +
function formatDate(date) {
var day;
if (date.getDate() < 10) {
day = "0" + date.getDate();
} else {
day = date.getDate();
}
var month;
var tempMonth = date.getMonth() + 1;
if ( tempMonth < 10){
month = "0" + tempMonth;
} else {
month = tempMonth;
}
var year = date.getFullYear();
return year + "-" + month + "-" + day;
}
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
jobDate = new Date(2016, 3, 7);
endDate = new Date(2016, 4, 1);
expireInterval = false;
timeoutVar = setTimeout(runJobFromJS,1000);
function runJobFromJS(){
var strDate = formatDate(jobDate);
console.log(strDate);
jobDate = jobDate.addDays(1);
if (jobDate >= endDate){
clearInterval(timeoutVar);
}
}
函数格式日期(日期){
var日;
if(date.getDate()<10){
day=“0”+date.getDate();
}否则{
day=date.getDate();
}
var月;
var tempMonth=date.getMonth()+1;
如果(时间月<10){
月份=“0”+临时月份;
}否则{
月=月;
}
var year=date.getFullYear();
返回年份+“-”+月份+“-”+天;
}
Date.prototype.addDays=函数(天){
var date=新日期(this.valueOf());
date.setDate(date.getDate()+天);
返回日期;
}
jobDate=新日期(2016年3月7日);
endDate=新日期(2016年4月1日);
expireInterval=false;
timeoutVar=setTimeout(runJobFromJS,1000);
函数runJobFromJS(){
var strDate=格式日期(jobDate);
console.log(标准日期);
jobDate=jobDate.addDays(1);
如果(作业日期>=结束日期){
清除间隔(timeoutVar);
}
}
我希望strDate
将打印从4月7日到5月1日的日期。但它只打印了一次。为什么您使用的setInterval
不能正常工作(在一段时间后以毫秒为单位执行一次函数)而不是(连续执行函数)
setInterval
的文档:
WindowOrWorkerGlobalScope mixin的setInterval()方法重复调用函数或执行代码段,每次调用之间有固定的时间延迟。它返回唯一标识该间隔的间隔ID,因此您可以稍后通过调用clearInterval()将其删除
setTimeout
的文档:
WindowOrWorkerGlobalScope mixin(以及window.setTimeout的后继者)的setTimeout()方法设置一个计时器,该计时器在计时器过期后执行一次函数或指定的代码段
演示:
函数格式日期(日期){
var日;
if(date.getDate()<10){
day=“0”+date.getDate();
}否则{
day=date.getDate();
}
var月;
var tempMonth=date.getMonth()+1;
如果(时间月<10){
月份=“0”+临时月份;
}否则{
月=月;
}
var year=date.getFullYear();
返回年份+“-”+月份+“-”+天;
}
Date.prototype.addDays=函数(天){
var date=新日期(this.valueOf());
date.setDate(date.getDate()+天);
返回日期;
}
jobDate=新日期(2016年3月7日);
endDate=新日期(2016年4月1日);
expireInterval=false;
timeoutVar=setInterval(runJobFromJS,1000);
函数runJobFromJS(){
var strDate=格式日期(jobDate);
document.getElementById(“结果”).textContent=strDate;
//console.log(标准日期);
jobDate=jobDate.addDays(1);
如果(作业日期>=结束日期){
清除间隔(timeoutVar);
}
}
您正在使用(仅执行一次)而不是
setInterval()方法调用函数或计算表达式
以指定的间隔(以毫秒为单位)。setInterval()方法将继续调用函数,直到
调用clearInterval()或关闭窗口
--
setTimeout()方法调用函数或计算表达式
在指定的毫秒数之后。提示:该函数仅适用于
执行一次。如果需要重复执行,请使用setInterval()命令
方法
在您的情况下,请尝试:
函数格式日期(日期){
var日;
if(date.getDate()<10){
day=“0”+date.getDate();
}否则{
day=date.getDate();
}
var月;
var tempMonth=date.getMonth()+1;
如果(时间月<10){
月份=“0”+临时月份;
}否则{
月=月;
}
var year=date.getFullYear();
返回年份+“-”+月份+“-”+天;
}
Date.prototype.addDays=函数(天){
var date=新日期(this.valueOf());
date.setDate(date.getDate()+天);
返回日期;
}
jobDate=新日期(2016年3月7日);
endDate=新日期(2016年4月1日);
expireInterval=false;
timeoutVar=setInterval(runJobFromJS,1000)//在这里
函数runJobFromJS(){
var strDate=格式日期(jobDate);
console.log(标准日期);
jobDate=jobDate.addDays(1);
如果(作业日期>=结束日期){
清除间隔(timeoutVar);
}
}
…因为setTimeout(以键入方式关闭它-您知道setInterval)它看起来只运行一次,因为您使用了setTimeout
;正如您所提到的,您应该使用setInterval
。我投票将这个问题作为离题题来结束,因为作者在完全承认潜在问题的同时忽略了代码中的一个错误。
timeoutVar = setInterval(runJobFromJS,1000);//not setTimeout
function runJobFromJS(){
var strDate = formatDate(jobDate);
console.log(strDate);
jobDate = jobDate.addDays(1);
if (jobDate >= endDate){
clearInterval(timeoutVar);
}
}