Pracowałem ze skryptami wykorzystującymi funkcję setInterval (fn, delay) w mojej aplikacji i po przeczytaniu o tym, jak działa setTimeout i JS, napotykam jakieś dziwne wyniki, więc zrobiłem test: Tutaj jest jsfiddle https://jsfiddle.net/jyq46uu1/2/JavaScript setTimeout nieoczekiwane wyjście
I kod jak sugeruje:
var limit = 1000000000;
var intervals = 0;
var totalTime = new Date();
var startTime = new Date();
var uid = setInterval(
function() {
// final lap?
if (intervals == 9) clearInterval(uid);
for (i = 0; i < limit; i += 1) {
// just working the CPU
}
// reduce the iterations
limit = limit/10;
intervals += 1;
console.log('Interval ' + intervals +' Time elapsed : ' + (new Date() - startTime));
// reset the time
startTime = new Date();
}, 250, 9);
Ok, z tego co mam czerwone od http://ejohn.org/blog/how-javascript-timers-work/ JavaScript dokonać połączenia zegara dla funkcji w setInterval nawet jeśli „wątek jest zablokowany”, więc jeśli funkcja nadal wykonuje połączenie, po prostu czeka w kolejce i tak dalej ... w moim notebooku, który produkuje ten kod:
"Interval 1 Time elapsed : 4264"
"Interval 2 Time elapsed : 477"
"Interval 3 Time elapsed : 91"
"Interval 4 Time elapsed : 170"
"Interval 5 Time elapsed : 246"
"Interval 6 Time elapsed : 242"
"Interval 7 Time elapsed : 248"
"Interval 8 Time elapsed : 248"
"Interval 9 Time elapsed : 248"
Ok, jeśli to, co mam czerwony jest prawdą, zanim skończył pierwszy przedział, wszystkie wywołania funkcji były w kolejce ... w moim skrypcie Redukuję pracę dla każdego wykonania, więc każde wezwanie powinno trwać mniej sekund niż poprzednia, LECZ bez względu na to, ile ustawiam iteracji, czas, który upłynął, zawsze podnosi tempo Interwału po 4. biegu. Może źle mi poszło, ale jeśli do czasu 4264 wszystkie funkcje są już w kolejce i mają działać natychmiast, powinny pokazywać mniej czasu, prawda? ... jeśli trzecia iteracja wyświetla 91, a pozostałe są tuż za nimi, powinny one wynosić 91 lub mniej. Ale tak nie jest.
Jeśli rozumiesz, co się dzieje, wyjaśnij mi to, ponieważ myślę, że czegoś brakuje.
Intryguje mnie drugi kod ... Nie widzę różnicy od pierwszego, ale wynik jest wyraźnie inny –
@GabrielMatusevich 'startTime = new Date();' u góry funkcji – Andreas
Dodałem 'startTime = new Date(); 'jako pierwsza linia w funkcji, aby zobaczyć czas, który upłynął TYLKO dla funkcji, bez efektów ubocznych w pomiarze czasu z setinterval – jperelli