Ihr Code wird unterschiedliche Ausführungsintervalle haben, und bei einigen Projekten, wie z. B. Online-Spielen, ist das nicht akzeptabel. Als erstes sollten Sie "myTimeoutFunction" folgendermaßen ändern, damit Ihr Code mit denselben Intevallen funktioniert:
function myTimeoutFunction()
{
setTimeout(myTimeoutFunction, 1000);
doStuff();
}
myTimeoutFunction()
Nach dieser Änderung wird sie gleich sein mit
function myTimeoutFunction()
{
doStuff();
}
myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);
Aber das Ergebnis ist immer noch nicht stabil, weil JS single-threaded ist. Für jetzt, wenn JS-Thread mit etwas beschäftigt sein wird, wird es nicht in der Lage, Ihre Callback-Funktion auszuführen, und die Ausführung wird für 2-3 msec verschoben werden. Haben Sie 60 Ausführungen pro Sekunde, und jedes Mal, wenn Sie zufällige 1-3 Sekunden Verzögerung haben, wird es absolut nicht akzeptabel (nach einer Minute wird es rund 7200 msec Verzögerung sein), und ich kann raten, etwas wie dieses zu verwenden:
function Timer(clb, timeout) {
this.clb = clb;
this.timeout = timeout;
this.stopTimeout = null;
this.precision = -1;
}
Timer.prototype.start = function() {
var me = this;
var now = new Date();
if(me.precision === -1) {
me.precision = now.getTime();
}
me.stopTimeout = setTimeout(function(){
me.start()
}, me.precision - now.getTime() + me.timeout);
me.precision += me.timeout;
me.clb();
};
Timer.prototype.stop = function() {
clearTimeout(this.stopTimeout);
this.precision = -1;
};
function myTimeoutFunction()
{
doStuff();
}
var timer = new Timer(myTimeoutFunction, 1000);
timer.start();
Dieser Code garantiert eine stabile Ausführungszeit. Auch wenn ein Thread beschäftigt ist und Ihr Code nach 1005 ms ausgeführt wird, wird er beim nächsten Mal eine Auszeit von 995 ms haben, und das Ergebnis wird stabil sein.
6 Stimmen
Wenn Sie möchten einige gute Details, wie Timer in JS arbeiten, schrieb John Resig eine gute Artikel zu diesem Thema
9 Stimmen
Es gibt auch den offensichtlichen Unterschied, dass setTimeout diese zusätzliche Codezeile erfordert, um sie weiterzugeben, was den Nachteil hat, dass es ein Wartungsproblem ist, aber den Vorteil, dass Sie den Zeitraum leicht ändern können
0 Stimmen
Versuchen Sie dies jsfiddle.net/pramendra/Y4vEV
4 Stimmen
Danke @JapanPro, aber ich hatte noch nie ein Problem damit, dass Timeouts funktionieren. In diesem Beitrag ging es darum, was der Unterschied ist und was verwendet werden sollte.
0 Stimmen
Link aktualisieren. Die Bearbeitungswarteschlange ist voll setTimeout VS setIntervall