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