2015-07-29 36 views
5

Czy istnieje sposób na wykonanie funkcji podobnie jak setInterval, ale limit czasu jest dokładnie taki sam za każdym razem. W setInterval limit czasu zmienia się w zależności od podanego limitu czasu, nieco więcej, trochę mniej, ale bardzo rzadko jest dokładnie taki sam.setInterval z dokładnym limitem czasu

Na przykład:

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

drukuje 50000,50002, 50005, 50994, 50997, 49999, 50003, 49998 i tak dalej. Chcę być wydrukowany zawsze 50000

+0

czas na pętlę – Raghavendra

+1

Nie. Jeśli chcesz czegoś, co jest dokładne do tysięcy sekund, będziesz potrzebował wehikułu czasu i uzyskasz go z przyszłości. Wartości 50994 i 50997 trudno mi w to uwierzyć, ale wszystkie pozostałe są całkowicie dopuszczalne. Dlaczego nie powiesz nam, jaki masz problem z powyższymi czasami, więc możemy w tym pomóc? – Archer

+0

@ Archer Wierzę, że to 50,994. – fuyushimoya

Odpowiedz

3

JavaScript jest wykonywany tylko w jednym przepływie, więc jeśli istnieje inny proces, który robi coś w tym samym czasie, zawsze istnieje szansa, że ​​funkcja timera nie zostanie wykonana na czas.

Jeśli naprawdę trzeba dokładnie przedział czasu można zablokować wykonanie jakiegokolwiek innego procesu z góry i mam nadzieję na najlepsze:

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); 
} 

Nadal nie będzie dokładny w przypadku proces jest blokowany przez system operacyjny choć ...

+0

Dzięki, to naprawdę mi pomaga :) – Hristo93

+1

Właśnie sobie uświadomiłem, że moja oryginalna odpowiedź powodowała, że ​​interwał blokowania zwiększał się o każdy krok. Zmodyfikowałem to rozwiązanie, aby tego uniknąć. –

Powiązane problemy