Javascript -运行时优先级和队列



如果我这样做了:

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

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

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

正如我在测试中看到的,首先,执行第一个警报,然后是第二个。

背景

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将首先显示,然后隐藏。请注意,在400毫秒之后可能会有其他setTimeout被计划执行,它们将在隐藏.element之前运行。

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

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

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

下面是一个类似的例子:

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

a很可能首先被调用。然而,我不认为这是有保证的,取决于JS引擎(是否使用严格的FIFO列表为即将到来的事件,什么是内部时钟分辨率等)

相关内容

  • 没有找到相关文章

最新更新