2016-06-22 8 views
5

Hier sind einige einfache Javascript-Code mit setTimeout:Wird `setTimeout (func, 0)` und `setTimeout (func, 1)` als gleich betrachtet?

function setTimeouts() { 
 
    setTimeout(function() { console.log(2); }, 2); 
 
    setTimeout(function() { console.log(1); }, 1); 
 
    setTimeout(function() { console.log(0); }, 0); 
 
} 
 

 
for (var i = 0; i < 10; i++) { 
 
    setTimeouts(); 
 
}

Wenn ich es auf Chrome laufen oder Node.js, sind die Ergebnisse ähnlich:

1 
0 
1 
0 
1 
0 
1 
0 
1 
0 
1 
0 
1 
0 
1 
0 
1 
0 
1 
0 
2 
2 
2 
2 
2 
2 
2 
2 
2 
2 

Sie können sehen, Alle Tasks mit Timeout 0 und 1 sind vor dem Timeout 2, was ich erwartet habe.

Aber die 0 und 1 sind miteinander gemischt, scheint, als hätten sie die gleiche Zeitüberschreitung. Was ich erwartet habe, ist alles 0 vor 1.

Wie das zu verstehen?

+0

Ist dies NodeJS oder Google Chrome? Beide haben unterschiedliche Timer-Implementierungen, die anders und an anderen Stellen spezifiziert sind. –

+0

@Freewind: Gibt es bestimmte Gründe, warum Sie '0' vor' 1' erwartet haben? –

+0

@Freewind: Dies ist ein wunderbares Gespräch über die Event-Schleife in Knoten, die Ihre Frage beantworten kann .. http://www.youtube.com/watch?v = 8aGhZQkoFbQ –

Antwort

0

Tatsächlich hat setTimeouts zweite Parameter eine minimale Wertbegrenzung. Für Firefox ist der Wert 4ms. Wenn der übergebene Wert kleiner als der Mindestwert ist, wird das Minimum verwendet.

Zu Ihrer Frage, ich denke, dieser Artikel hilfreich ist: http://javascript.info/tutorial/events-and-timing-depth

+0

Bitte führen Sie auf Firefox. Die Tasks mit kleinerem Timeout werden zuerst ausgeführt, auch wenn sie <4 sind – Freewind