Javascript - 运行时优先级和队列

时间:2013-04-24 10:33:34

标签: javascript timeout queue

如果我这样做:

setTimeout(function(){ alert('antani'); },400);
    setTimeout(function(){ alert('supercazzola'); },400);

为什么这个脚本会在这两个超时之间生成队列?

他们不应该在同一时刻发出警报吗?

我可以看到测试它,首先,执行第一个警报,然后执行第二个。

2 个答案:

答案 0 :(得分:1)

请阅读:http://ejohn.org/blog/how-javascript-timers-work/

这是一个类似的例子:

函数a(){

  var num = 5;
  console.log( ++num );
  setTimeout( a, 100 );
};
setTimeout(a,2000);

按时间顺序:

你正在定义函数a而不调用它

你计划在两秒后调用一个:setTimeout(a,2000)

它被称为

当它被调用时,它会在100毫秒后调度自己进行调用

您的代码基本上会休眠2秒,然后执行100毫秒的暂停[*]。

然而,根据您的背景判断,您在询问以下情况的优先级是什么:

setTimeout(a, 2000);
setTimeout(b, 100);

好吧,很可能首先会调用b(假设第一行和第二行之间没有不可预测的暂停,例如由于整体操作系统性能问题)。

如果您使用相同的超时:

setTimeout(a, 100);
setTimeout(b, 100);

最有可能首先被召唤。但是我不认为这是有保证的,取决于JS引擎(它是否为即将发生的事件使用严格的FIFO列表,内部时钟分辨率是什么等)。

答案 1 :(得分:1)

<强>背景

JavaScript只有一个运行解释器的线程。这意味着事件永远不会同时处理。当您设置超时时,您实际上订阅了浏览器的某些内部事件,每次浏览器处于空闲模式时(当不忙于渲染,解析或执行某些脚本等时)都会触发。此事件的处理程序以及计划的时间将根据脚本中出现的顺序setTimeout发布到队列中。每次触发此内部事件时,浏览器都会检查每个处理程序并决定是执行还是从队列中删除它还是跳过它。

同一时间

当您以相同的估计时间一个接一个地安排任务时

setTimeout(function(){ $('.element').hide(); },400);
setTimeout(function(){ $('.element').show(); },400);

.element将首先隐藏,然后显示。请注意,这并不意味着浏览器会在隐藏后将更改呈现给.element。大多数浏览器只会在脚本执行完毕后才会呈现。

不同的时间

当您安排具有不同估算时间的任务时:

setTimeout(function(){ $('.element').hide(); },401);
setTimeout(function(){ $('.element').show(); },400);

结果可能无法预测。可能发生以下情况:

  • 大于或等于400且小于401毫秒已经过去,浏览器开始处理事件处理程序。在这种情况下,.element将首先显示然后隐藏。请注意,可能还有其他setTimeout计划在400毫秒后执行,并且它们将在隐藏.element之前运行。

  • 浏览器在第一次开始处理事件处理程序之前忙于401毫秒或更长时间。在这种情况下,最有可能(取决于浏览器实现).element将首先被隐藏然后显示,尽管根据估计时间它应该反之亦然!

关于你的问题:设置超时的时间是相同的还是一些正delta,答案是 NO 。它不一样,当您使用delta设置超时时,总是有可能在它们之间处理另一个事件或超时。