Javascript - 运行时优先级和队列

标签 javascript timeout queue

如果我这样做:

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

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

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

关于Javascript - 运行时优先级和队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16189735/

相关文章:

python - 等待 Python 中存在的元素

c# - Azure Kubernetes .NET Core 应用程序到 Azure SQL 数据库间歇性错误 258

Python:如何在 SocketServer.TCPServer 中设置接收数据超时

c# - 如何检查队列是否为空?

algorithm - 查找队列中的最小值,并将其从队列中删除

javascript - 对所有 SVG <path> snap.svg 重复代码功能

javascript - 如何使用 jQuery 重置 CSS?

javascript - 如何将参数传递给模态弹出窗口?

laravel - 为什么我收到这个错误 laravel-worker : ERROR (no such group)

javascript - Python中是否有相当于Javascript的hasOwnProperty()?