首页 > 试题广场 >

计时器

[编程题]计时器
  • 热度指数:129209 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
实现一个打点计时器,要求
1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出
推荐
setInterval() 方***按照指定周期不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。注意第一个数需要立即输出即可。
function count(start, end) {
  //立即输出第一个值
  console.log(start++);
     var timer = setInterval(function(){
         if(start <= end){
             console.log(start++);
         }else{
             clearInterval(timer);
         }
     },100);
    //返回一个对象
     return {
         cancel : function(){
             clearInterval(timer);
         }
     };
 } 

编辑于 2015-08-18 21:01:11 回复(38)
function go(i, end, clock) {
  console.log(i);
  if (i >= end) return;
  clock.interval = setTimeout(() => go(++i, end, clock), 100);
}
function count(start, end) {
  const result = {
    interval: 0,
    cancel: function () {
      clearTimeout(this.interval);
    },
  };
  go(start, end, result);
  return result;
}
发表于 2021-05-21 01:17:58 回复(0)
function count(start, end) {
    console.log(start)
    var time = setInterval(function(){
        if(start < end){
            console.log(++start) 
        }else{
           clearInterval(time) 
        }
    },1000)
        
    return {
        cancel: function(){
            clearInterval(time)
        }
    }
}
注意立即输出第一个数
发表于 2021-03-31 22:50:32 回复(0)
  • 返回对象形式
function count(start, end) {
    var temp = start;
    console.log(temp);
    var timmer = setInterval(function(){
        if(temp < end){
            temp += 1;
            console.log(temp);
        }else{
            clearInterval(timmer);
        }
    }, 100);
    var resObj = {
        timmer: timmer,
        cancel: function(){
            clearInterval(this.timmer);
        }
    };
    return resObj;
}
发表于 2020-04-11 16:55:01 回复(0)
function count(start, end) {
    var timerArr = [];
    for (var i = start;i<=end;i++){
        (function(m){
            timerArr[i]=setTimeout(function(){
                console.log(m)
            }, (m-start)*100)
        })(i)
    }
    return {
        cancel: function(){
            timerArr.forEach(function(time){
                clearTimeout(time);
            })
        }
    }
}

不通过
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为50.00%

到底哪里错了呢?
发表于 2020-03-12 21:40:35 回复(0)
因为题目要求是一个计时器,所以自然会想到使用setInterval()方法来实现,有因为需要一个方法来取消计时,所以会用到clearInterval()方法,为了代码的简洁,可以声明一个变量保存setInterval。
发表于 2020-03-12 17:28:45 回复(0)
function count(start, end) {
    console.log(start++);//第一个数需要立即输出
    //setInterval(code,millisec,lang)
    //参数1:必需。要调用的函数或要执行的代码串
    //参数2:必须。周期性执行或调用 code 之间的时间间隔,以毫秒计
    //参数3:可选。
    var time = setInterval(function(){
        if(start <= end){
            console.log(start++);
        }else{
             clearInterval(time);
        }
    },100);
    return {
        cancel:function(){
            clearInterval(time);
        }
    }
}
//注:setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式。
//方***不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
//setTimeout() :在指定的毫秒数后调用函数或计算表达式,写法和setInterval()一样

编辑于 2019-09-11 17:44:50 回复(0)
function count(start, end) {
    console.log(start)
    let timer = setInterval(()=>{
       if(start < end){
            start++;                
            console.log(start); 
        }
    },100);
    return {
        cancel:() => clearTimeout(timer)
    }
}

发表于 2019-09-10 11:51:00 回复(0)
function count(start, end) {
    console.log(start++);
    var id = setInterval(function() {
        start <= end ? console.log(start++) : clearInterval(id);
    }, 100);
    return {
        cancel : function() {
            clearInterval(id);
        }
    }
}

发表于 2019-08-10 08:56:40 回复(0)
function count(start, end) {
    console.log(start);     
    for(var i=start+1;i<=end;i++){
       (function(i){
          var timeout = setTimeout(function(){
             console.log(i);
           },100*(i+1))
        })(i);
    } 
       
    return {cancel:function(){
            clearTimeout(timeout);
        }
    };
}
count(6,20);
我这个为什么过不了测试用例?
发表于 2019-06-17 10:58:00 回复(0)
function count(start, end) {
    console.log(start);//第一个数立即输出;
    var begin=setInterval(function(){
         if(start < end){//判断开始数字是否小于结束数字(有可能只有一个数字)
            console.log(++start);//操作start之前,将start加一
        }
        else{
            clearInterval(begin);//如果输入的数据格式不对,开始数字小于结束数字,则计时器停止;
        }
    },100);
    return{
        cancel:function(){//返回一个对象,该对象具有cancel方法
            clearInterval(begin);
        }
    }
}


发表于 2019-05-10 14:53:38 回复(0)
function count(start, end) {
    var time=0;
    var timer;
    console.log(start);
    timer=window.requestAnimationFrame(function fn(timestamp){
        if(timestamp-time>=100){
            start++;
            if(start<=end){
                 console.log(start)
                 time=timestamp;
            }
            if(start>end){
                window.cancelAnimationFrame(timer);
            }
        }
        timer=window.requestAnimationFrame(fn)
    });
    return{
        cancel(){
            window.cancelAnimationFrame(timer);
        }
    }
}

我的这段代码为什么没通过求指出
发表于 2019-03-13 18:20:42 回复(0)
function count(start, end) {
    var _start = start;
    console.log(_start);
    var timer = setInterval(function(){
        _start++;
        console.log(_start);
        if(_start == end){
            cancel();
        }
    },100);
    function cancel(){
        clearInterval(timer);
    }
    return {
        cancel:cancel
    }
}
发表于 2018-04-21 22:39:17 回复(0)
function count(start, end) {
    console.log(start);
    if(start<=end) {
         for(var i=start+1;i<=end;i++) {
        (function(j){
            var timer=setTimeout(function() {
                console.log(j);
            },100) 
        })(i)
    }
    }
   
    return {
        cancel: function() {
            clearTimeout(timer);
        }
    }
}
大佬们,这样为啥不行啊,只有50%
编辑于 2018-03-14 22:01:38 回复(0)
function count(start, end) {
  console.log(start++);
  var myInterval = setInterval(function(){
    if(start<=end) console.log(start++);
    else clearInterval(myInterval);
  },100);
  return {
    cancel:function(){clearInterval(myInterval);}
  };
}
没事特别的了
发表于 2018-03-11 14:25:52 回复(0)
看到第一个人做的,里面出现小于等于,这时候控制台会多出一个数据,出现错误
如图
当取消掉=-后则全部通过

正确答案:
function count(start, end) {
    console.log(start)
    var dingshi = setInterval(function () {
        if (start < end) {
            console.log(start += 1)
        }
    }, 100)
    return { cancel: function () { clearInterval(dingshi)} }
}

发表于 2018-01-16 19:00:46 回复(4)
function count(start, end) { console.log(start++);  var timer=setInterval(function () { if (startconsole.log(start++);  } else { clearInterval(timer);  }
    },100);  return{ cancel:function () { clearInterval(timer);  }
    }
}

这个关于计时器的问题困扰了我很久,刚开始使用了for循环,但是执行结果总是直接一次性打印出所有数字。忘记了定时器本身就具有循环的功能以及自增自减的妙处。看了讨论里面的解答才茅塞顿开

发表于 2017-08-30 17:44:38 回复(0)
function count(start, end) {
				var i=start;
			var st=setInterval(function  () {
					console.log(i);
					i++;
					if(i>end){
						clearInterval(st);
					}
				},100)
				
				return{
				cancel:
	                function(){	clearInterval(st);
				}
				} 
					
				
	}
//1.浏览器可以运行,但是测试过不了;
//2.return 在这个函数中有啥用?
//求大神解答下。

发表于 2017-07-12 11:45:42 回复(0)
function count(start, end) {
    var i= 0;
    console.log(i++);
    var time=setInterval(function(){
        o.j+=100;
        if(o.j >= end)
            return;
       console.log(i++);
    },100);
    var o = {
        j : 0,
        cancel : function(){
            clearInterval(time);
        }
    }
    return o;
}
我觉得我的没错...
发表于 2017-04-12 15:56:19 回复(0)