如何在JavaScript

时间:2015-12-25 04:42:30

标签: 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);




此代码在大约3-4秒内执行,具体取决于机器和浏览器。如何让它在1秒钟内完成?

3 个答案:

答案 0 :(得分:7)

浏览器中的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...

但是,如果您能够在接近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);

这与你的程序基本相同

  • n每1ms递增一次
  • 然而,该过程的结束由另一个1秒计时器
  • 控制

在Chrome中,我获得了252 n个增量,两个日期相距约1秒。

答案 1 :(得分:1)

以下是每次迭代一个计时器的方法演示。做1000&#34;迭代&#34;大约需要1秒钟。相同的回调。设计很粗糙,因为它只是一个例子。

<强> jsFiddle Demo

&#13;
&#13;
//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](); }
&#13;
<div id="display">
</div>
&#13;
&#13;
&#13;

所有浏览器都有不同的处理方式。在大多数浏览器中,尤其是chrome,任务执行的默认最短时间(如使用间隔或超时)为4毫秒。

4ms窗口的结果是你的1000次迭代在大约4秒内完成。所以,显然这比1000次迭代中所需的1秒长。

在现代浏览器中执行时,没有理想的(可能的?)方法在JavaScript中完成完全 1毫秒的迭代。如果空间(内存和处理能力)不是问题,你最好的选择是手动为每次迭代创建一个计时器,然后执行它们的整个集合。这当然有其自身的问题,例如每个任务是否在它应该的时候执行。

答案 2 :(得分:0)

#include <iostream> #include <string> #include "FileSelect.h" using namespace std; void file_select() { cout << " FILE SELECT \n"; cout << "==================================================================================\n"; cout << "1. File 1\n"; cout << "2. File 2\n"; cout << "3. File 3\n"; cout << "4. Return to Main Menu\n"; char fileselect; cin >> fileselect; if (fileselect == '1') { } else if (fileselect == '2') { } else if (fileselect == '3') { } else if (fileselect == '4') { main_menu(); } else { cout << "Invalid Option."; } }

中尝试相同的脚本

ECMA Script 6