2012-09-28 15 views
18

Ich habe Probleme auf Firefox 15 und Chrome 21 mit dem folgenden Code:Was ist die maximale Verzögerung für setInterval?

setInterval(function() { console.log('test') }, 300000000000) 

Auf beiden Browsern wird die Funktion sofort wiederholt sehr schnell laufen. Sicher, das ist eine große Zahl (in etwa 10 Jahren), aber ich würde nicht erwarten, dass es als eine kleine oder negative Zahl behandelt wird. Ich habe in keiner Dokumentation eine maximal zulässige Verzögerung gesehen. Weiß jemand, ob es einen Standard max gibt, oder ob das nur der Browser ist, der lustig ist?

+2

ich vermute, dass die Zahl auf eine ganze Zahl 32-Bit dazu gezwungen werden kann, irgendwo auf dem Weg ... – Pointy

+0

@Pointy, das ist wahrscheinlich eine gute Vermutung. Hmm ...: -/ – Nogwater

+0

@ Pointy. Es sieht aus wie 2^31-1 ist sicher, aber 2^31 bricht, so dass Sie fast definitiv Recht haben. Wenn du dies als Antwort postest, gebe ich dir das Karma. – Nogwater

Antwort

10

Ich kann im Moment keine Dokumentation finden, aber ich wäre nicht überrascht, wenn der Timer-Wert in eine 32-Bit-Ganzzahl mit Vorzeichen passen müsste.

+0

Das ist richtig. setInterval() schlägt mit Werten größer als 32-Bit vorzeichenbehaftet int. –

4

Ich denke, dass die maximale Verzögerung 2 -1 ist, die 2.147.483.647ms ist. Der maximale Wert einer 32-Bit-Ganzzahl mit Vorzeichen in ms. Wenn es unsigniert wäre, wäre es 2 -1 = 4,294,967,295.

+0

2 Milliarden 147 Millionen. – gr3g

+1

Guter Punkt der Typ ist signiert. – rekire

20

Das Intervall wird in einem signierten 32-Bit-Int gespeichert (in der getesteten Implementierung: V8 in Google Chrome). Das angezeigte Verhalten ist also das Ergebnis des Überlaufs des Intervalls auf eine negative Zahl (in diesem Fall) verhält sich so, als wäre das Intervall 0). Daher ist das maximale Intervall, das Sie verwenden können, 2**31 - 1.

Hier ist, wie ich festgestellt, dass dies der Fall war:

setInterval(function(){console.log("hi");}, Math.pow(2,31)); 

verhält sich wie das Intervall 0 ist.

setInterval(function(){console.log("hi");}, Math.pow(2,31) - 1); 

Feuert nicht in der Zeit, die ich bereit war zu warten.

setInterval(function(){console.log("hi");}, Math.pow(2,33) + 1000); 

verhält sich wie das Intervall 1000 (eine Sekunde) ist. Hier wirkt sich die 2**33 nicht auf die ersten 32 Bit aus, also erhalten wir nur 1000.

Das höchstmögliche Intervall, 2**31-1ms ist ein wenig schüchtern von 25 Tagen, also mehr als genug für etwas Vernünftiges.

+0

Das Intervall * in dieser bestimmten Implementierung * ist in .. gespeichert, aber +1 für die verwendete Methode. –

+0

Schöne Beispieltests.Ich habe im Wesentlichen die gleiche dünne in meinem Kommentar zu der Frage selbst gemacht, aber +1 für das Zeigen Ihrer Arbeit. :) – Nogwater

0

Max ist 2,147,483,647 (2 -1)

Seien Sie vorsichtig, wenn Sie die Zahl größer als das machen, wird es sofort ausgeführt (Imaging, dass Sie einen negativen Wert gesetzt, so wird der Browser laufen unendlich Schleife)

setInterval(()=>console.log('n'),2147483647) 
31 
setInterval(()=>console.log('y'),2147483648) 
38 
(1588) y 
Verwandte Themen