我在javascript中知道此代码将始终打印
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);
答案 0 :(得分:3)
您对第一种情况的理解似乎很好。一秒钟之后,它们全部被添加到按顺序排队的事件中,因此它们按照该顺序执行,但考虑事件在第二个示例中排队的顺序,同时注意到超时和间隔不准确。
超时200意味着 至少 200毫秒,而不是200毫秒。因此,假设您的超时200在203毫秒后执行,然后立即排队b
以执行800
毫秒之后。 b
将在第一次超时开始后至少1003毫秒后排队等待执行。 a
的第一个超时可以在502毫秒后执行,c
的第一个超时可以在601毫秒后执行。然后你会得到输出:c a b。如果第一次超时是在200
毫秒之后而不是在203
之后发生的,那么您会看到:b c a。
答案 1 :(得分:2)
正如documentation for setTimeout所述:
可能不会在精确延迟中调用回调 毫秒。 Node.js不保证确切的时间 什么时候回调将会触发,也不会触发它们。回调将是 尽可能接近指定的时间。