2016-08-02 121 views
2

我知道在JavaScript中嵌套的setTimeout,該代碼將始終打印與同時打印隨機

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

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

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

a 
c 
b 

我可以重新設置的超時得到輸出我想要線的基礎上,這些項目將在隊列準備好執行。但我不明白爲什麼這個代碼隨機打印。不應該這也是基於javascript如何推動代碼排隊和每次打印相同的值而不是隨機打印。

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); 

回答

3

你對第一個案件的理解似乎很好。一秒鐘之後,它們全部被添加到按順序排隊的事件中,所以它們按照該順序執行,但考慮第二個示例中事件排隊的順序,同時注意超時和間隔不準確。

200超時意味着至少 200毫秒,不完全是200毫秒。所以,假設您的超時時間200在203毫秒後執行,然後立即排隊b以執行800毫秒。從第一次超時開始至少1003毫秒後,b將排隊等待執行。 a的第一個超時可以在502毫秒後執行,c的第一個超時可以在601毫秒後執行。然後你會得到輸出:c a b。如果第一次超時發生在200毫秒之後,而不是203之後,您會看到:b c a。

2

由於documentation for setTimeout狀態:

回調可能不會在被調用精確延遲 毫秒。 Node.js不保證在回調觸發時的確切時間 ,也不保證它們的排序。回撥將爲 ,儘可能接近指定的時間。