2015-07-29 28 views
5

SetInterval gibi bir işlev yapmanın bir yolu var, ancak zaman aşımı her seferinde aynı olacak. SetInterval'da zaman aşımı verilen zamanaşımına göre değişir, biraz daha fazla, biraz daha az, ama aynı şekilde çok nadirdir. ÖrneğinsetInterval tam zaman aşımı

:

var before = new Date().getTime(); 
setInterval(function() { 
var after = new Date().getTime(); 
newTab.window.location=someURL; 
console.log((after - before)); 
before = after; 
}, 50000); 

baskı 50000,50002, böylece 50005, 50.994, 50997, 49999, 50003, 49.998 ve. Her zaman basılmak istiyorum 50000

+0

Döngüde zaman kullan – Raghavendra

+1

Hayır. Eğer bir saniyede doğru olan bir şey istiyorsanız o zaman bir zaman makinesine ihtiyacınız olacak ve gelecekten elde edebileceksiniz. 50994 ve 50997 değerlerine inanıyorum, ama tüm diğerleri mükemmel kabul edilebilir. Neden sorunların yukarıdaki zamanlarla olduğunu bize anlatmıyorsunuz, bunun yerine bunun için yardımcı olabiliriz? – Archer

+0

@Archer 50.994 olduğuna inanıyorum. – fuyushimoya

cevap

3

Javascript, yalnızca bir akışta yürütülür, böylece aynı anda başka bir işlem yapılırsa, zamanlayıcı işlevinin zamanında yürütme şansı her zaman vardır.

gerçekten tam zaman aralığını gerekiyorsa önceden başka sürecin yürütülmesine engellemek ve en iyisini umut:

function setExactInterval(handler, time) { 
    var startTime = Date.now(); 
    setTimeout(function() { 
     while (true) { 
      var currentTime = Date.now(); 
      var diff = currentTime - startTime; 
      if (diff >= time) { 
       setExactInterval(handler, time); 
       return handler(); 
      } 
     } 
    }, time - 50); 
} 

Hala tam durumunda işlem OS tarafından engellendi olmayacak bununla birlikte ...

+0

Teşekkürler, bu gerçekten bana yardımcı oluyor :) – Hristo93

+1

Sadece fark ettim ki, orijinal cevabım her adımı artırmak için engelleme aralığına neden oldu. Bunu önlemek için çözümü düzenledim. –