Jay*_*cee 15 javascript loops setinterval
n = 0;
var timer = setInterval(function() {
if (n == 0) {
console.log(new Date());
}
// execute some other code here
n++;
if (n == 1000) {
clearInterval(timer);
console.log(new Date());
}
}, 1);
Run Code Online (Sandbox Code Playgroud)
此代码在大约3-4秒内执行,具体取决于机器和浏览器.如何让它在1秒内完成?
浏览器中的Javascript计时器不准确(对于该用法,C会更好).
但是,在延迟尽可能高的情况下,您可以获得更好的平均精度,尤其是避免低值,例如1 ms.
在一秒钟内对一个函数进行1000次均匀定时调用将很困难.一毫秒是一个低值,触发函数本身的简单执行(加上处理定时器的开销)可能需要一个接近1毫秒(或更多)的时间......这意味着JS解释器在1ms后调用该函数,执行代码然后设置一个新的1ms计时器.因此,呼叫之间的间隔超过1毫秒.
JS解释器做了类似的事情
At t call function <-- this takes
execute function <-- some
at t+x set new 1ms timer <-- time
etc...
Run Code Online (Sandbox Code Playgroud)
但是,如果您能够在接近1秒的时间范围内(比现在的3-4秒)结束该过程,尽可能多地进行 1毫秒的呼叫,这是可能的.
var n = 0;
var timer= setInterval(function(){
if(n++ == 0) {
console.log(new Date());
}
}, 1);
setTimeout(function() {
clearInterval(timer);
console.log("Got n="+n+" at "+(new Date()));
}, 1000);
Run Code Online (Sandbox Code Playgroud)
这与你的程序基本相同
n
每1ms递增一次在Chrome中,我得到252
n个增量,两个日期相差约1秒.
以下是每次迭代使用一个计时器的方法的演示。对同一回调进行 1000 次“迭代”大约需要 1 秒。该设计很粗糙,因为它只是一个示例。
//Function to compose the array of timers
function timers(count, callback){
var timers = [];
for(var i = 0; i < count; i++){
timers.push(timer(callback,i));
}
return timers;
};
//Function to compose individual timer
function timer(callback, delay){
return function(){
setTimeout(callback,delay);
};
};
//Usage
console.log("Start:",new Date()); //timestamp
var display = document.querySelector("#display");
var settings = { n : 0 };
display.innerHTML = settings.n;
//Arrange timers and callback
var set = timers(1000,function(){
this.n++;
display.innerHTML = this.n;
if(this.n === 1000) console.log("End:",new Date());
}.bind(settings));
//Execute timers
for(var i = 0; i < set.length; i++){ set[i](); }
Run Code Online (Sandbox Code Playgroud)
<div id="display">
</div>
Run Code Online (Sandbox Code Playgroud)
所有浏览器对此的处理方式都不同。在大多数浏览器中,尤其是 Chrome,任务执行的默认最小可能时间(如使用间隔或超时)是 4 毫秒。
4 毫秒窗口的结果是您的 1000 次迭代在大约 4 秒内完成。因此,显然这比 1000 次迭代中所需的 1 秒要长。
在现代浏览器中执行时,没有一种理想的(可能的?)方法可以在 JavaScript 中完成精确的1 毫秒迭代。如果空间(内存和处理能力)不是问题,最好的选择是手动为每次迭代创建一个计时器,然后执行整组计时器。这当然有其自身的问题,例如每个任务是否在应该的时间执行。