我有一个秒表,必须调用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.我做错了什么?感谢
-
解释 - 在阅读完评论后,我明白我的意图并不清楚 - 我想要的只是在间隔开始和清除之间获得一段经过的时间(以毫秒为单位)。有人能指出我正确的方向是这个代码不是最好的方法,谢谢
答案 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);