繁体   English   中英

Javascript - 运行时优先级和队列

[英]Javascript - run time priority and queue

如果我做:

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

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

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

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

请阅读: 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将首先被调用(假设第一行和第二行之间没有不可预测的暂停,例如由于整体OS性能问题)。

如果您使用相同的超时:

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

一个意志最有可能被称为第一。 但是我不认为这是有保证的并且取决于JS引擎(它是否对即将发生的事件使用严格的FIFO列表,内部时钟分辨率是什么等)

背景

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毫秒后执行,它们将在hide .element之前运行。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM