Ich habe mit Skripten arbeiten mit SetInterval (Fn, Verzögerung) -Funktion in meiner Anwendung und nachdem ich gelesen habe, wie SetTimeout und JS arbeiten ich einige seltsame Ergebnisse, so dass ich einen Test gemacht: Hier ist die jsfiddle https://jsfiddle.net/jyq46uu1/2/Javascript setTimeout unerwartete Ausgabe
Und wie der Code vorgeschlagen:
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, was ich red von http://ejohn.org/blog/how-javascript-timers-work/ Javascript haben die Timer-Anrufe für die Funktion in setInterval selbst machen, wenn der "Thread blockiert", so Wenn die Funktion noch ausgeführt wird, wird der Anruf gerade in die Warteschlange gestellt und so weiter ... in meinem Notebook produziert, dass Code aus:
"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, wenn das, was ich rot habe wahr ist, durch die Zeit, das erste Intervall beendet ist, wurden alle Funktionen Anrufe in der Warteschlange ... in meinem Skript Ich reduziere die Arbeit für jede Ausführung, so dass jeder Anruf weniger Sekunden dauern sollte als der vorherige, ABER egal wie viele Iterationen ich einstelle, die verstrichene Zeit nimmt immer das Intervall-Tempo nach dem vierten Lauf auf. Vielleicht habe ich es falsch verstanden, aber wenn zur Zeit 4264 alle Funktionen bereits in der Warteschlange sind und sofort ausgeführt werden sollen, sollten sie weniger Zeit zeigen, oder? ... wenn die dritte Iteration 91 anzeigt und die anderen knapp dahinter stehen, sollten sie 91 oder weniger nehmen. Aber das ist nicht der Fall.
Wenn Sie verstehen, was passiert, bitte erklären Sie es mir, weil ich denke, dass ich etwas vermisse.
Ich bin fasziniert über den zweiten Code ... Ich sehe nicht den Unterschied von der ersten, aber die Ausgabe ist eindeutig anders –
@GabrielMatusevich 'startTime = new Date();' an der Spitze der Funktion – Andreas
Ich habe 'startTime = new Date(); 'als erste Zeile in Funktion, um die verstrichene Zeit NUR für die Funktion zu sehen, ohne Nebenwirkungen in der Zeitmessung von setinterval – jperelli