Javascript秒表不工作

时间:2015-10-10 15:55:39

标签: javascript

我有一个秒表,必须调用setInterval并每毫秒增加一个变量,这样当我调用Stop()时我得到了ElapsedTime。 我将用它来测量请求所需的时间,但为了简单起见,我只添加了一个睡眠功能

   function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}


var Stopwatch = 
{
    ElapsedTime: 0,
    CounterId :0, 

    IncrementElapsedTime:function(){
            this.ElapsedTime++;
            console.log("incremented to: " + this.ElapsedTime);    
    },

    Start: function(){
        this.CounterId = setInterval(this.IncrementElapsedTime(), 1);
    },


    Stop: function(){
        clearInterval(this.CounterId);
    }
}

Stopwatch.Start();

sleep(500);

Stopwatch.Stop();
console.log("final result: " + Stopwatch.ElapsedTime);

我希望自从我等待500毫秒后,调用Stop后的ElapsedTime正好是500.但是ElapsedTime只显示1而不是500.我做错了什么?感谢

-

解释 - 在阅读完评论后,我明白我的意图并不清楚 - 我想要的只是在间隔开始和清除之间获得一段经过的时间(以毫秒为单位)。有人能指出我正确的方向是这个代码不是最好的方法,谢谢

2 个答案:

答案 0 :(得分:1)

这是因为JavaScript只是顺序单线程而不是多线程。这意味着当繁忙循环sleep()正在运行时,setInterval无法进行任何调用,这导致仅在调用.Stop()之前调用一次。

只要经过的时间没有被繁忙的循环停止或阻止执行(如提示),您将从.Stop()获得正确的值。

答案 1 :(得分:1)

有两点需要研究。在开始时,您无法在this中引用setInterval。这需要一个全局引用,因为它从触发setInterval的对象执行分离。第二点是脚本执行者忙于你的sleep()并忘记执行你想要的东西。此外,setInterval不应用于精确应用。以下代码仅在我的浏览器上计算2646,即使我要求在10000ms之后停止计时器:

   var Stopwatch = 
    {
        ElapsedTime: 0,
        CounterId :0,
        IncrementElapsedTime:function(){
                this.ElapsedTime++;
                console.log("incremented to: " + this.ElapsedTime);    
        },

        Start: function(){
            this.CounterId = setInterval(function(){Stopwatch.IncrementElapsedTime();}, 1);
        },


        Stop: function(){
            clearInterval(this.CounterId);
        }
    }

    Stopwatch.Start();
    setTimeout(function() {
        Stopwatch.Stop();
        console.log("final result: " + Stopwatch.ElapsedTime);
    }, 10000);