具有相同时间的嵌套settimeout随机打印

时间:2016-08-02 22:54:04

标签: javascript settimeout

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

2 个答案:

答案 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不保证确切的时间   什么时候回调将会触发,也不会触发它们。回调将是   尽可能接近指定的时间。