2016-08-02 15 views
2

ich in Javascript weiß, dass dieser Code immerNested SetTimeout mit gleicher Zeit druckt zufällige

setTimeout(function(){ 
    console.log('a'); 
}, 1000) 

setTimeout(function(){ 
    console.log('c'); 
}, 1000) 

setTimeout(function(){ 
    console.log('b'); 
}, 1000) 

a 
c 
b 

druckt Und ich kann Satz Timeout neu anordnen Ausgang i auf der Grundlage von Linien will bekommen und diese Elemente in der Warteschlange sein bereit ausgeführt zu werden. Aber ich verstehe nicht, warum dieser Code Werte zufällig drucken. Sollte dies nicht auch darauf basieren, wie Javascript Code in die Warteschlange schiebt und denselben Wert jedes Mal anstelle des zufälligen Druckes druckt.

setTimeout(function(){ 
    setTimeout(function(){ 
    console.log('a'); 
    }, 500) 
}, 500) 

setTimeout(function(){ 
    setTimeout(function(){ 
    console.log('b'); 
    }, 800) 
}, 200) 

setTimeout(function(){ 
    setTimeout(function(){ 
    console.log('c'); 
    }, 400); 
}, 600); 

Antwort

3

Sie verstehen, der erste Fall scheint gut. Nach einer Sekunde werden sie alle dem Ereignis in der Reihenfolge der Warteschlange hinzugefügt. Daher werden sie in dieser Reihenfolge ausgeführt. Denken Sie jedoch darüber nach, in welcher Reihenfolge die Ereignisse in Ihrem zweiten Beispiel in die Warteschlange gestellt werden, und beachten Sie, dass Zeitüberschreitungen und Intervalle nicht exakt sind.

Ein Timeout von 200 bedeutet mindestens 200 Millisekunden, nicht genau 200 Millisekunden. Angenommen, Ihr Timeout von 200 wird nach 203 Millisekunden ausgeführt und dann sofort in die Warteschlange b gestellt, um Millisekunden später 800 auszuführen. b wird in die Warteschlange gestellt, um mindestens 1003 Millisekunden nach dem Start der ersten Timeouts auszuführen. Das erste Timeout für a könnte nach 502 Millisekunden ausgeführt werden und das erste Timeout für c könnte nach 601 Millisekunden ausgeführt werden. Dann würden Sie die Ausgabe erhalten: c a b. Wenn das erste Timeout unmittelbar nach 200 Millisekunden anstatt nach 203 stattgefunden hätte, hätten Sie gesehen: b c a.

2

Als documentation for setTimeout heißt es:

Der Rückruf wird wahrscheinlich nicht in exakt Millisekunden Verzögerung aufgerufen werden. Node.js übernimmt keine Garantie für das genaue Timing von , wenn Rückrufe ausgelöst werden, noch für deren Bestellung. Der Rückruf wird so nah wie möglich an der angegebenen Uhrzeit aufgerufen.