2016-08-02 123 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不保证在回调触发时的确切时间 ,也不保证它们的排序。回拨将为 ,尽可能接近指定的时间。