【问题标题】:Javascript - run time priority and queueJavascript - 运行时优先级和队列
【发布时间】:2013-04-24 10:33:33
【问题描述】:

如果我这样做:

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

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

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

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

【问题讨论】:

  • @Wheretheresa会不会同样的超时发生冲突,只执行第一个超时,但是为什么:)
  • 不,他们都被我处决了。
  • @WheretheresaWill 你是对的对不起,我编辑了明确的问题:/

标签: javascript timeout queue


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

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

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

【讨论】:

    【解决方案2】:

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

    这是一个类似的例子:

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

    按时间顺序:

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

    您正在安排 a 在两秒后被调用:setTimeout(a,2000)

    它被称为

    当它被调用时,它会安排自己在 100 毫秒后调用

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

    但是,根据您的上下文判断,您在问以下情况下的优先级是什么:

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

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

    如果您使用相同的超时:

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

    a 很可能首先被调用。但是我不认为这是有保证的,并且取决于 JS 引擎(它是否对即将发生的事件使用严格的 FIFO 列表,内部时钟分辨率是多少等)

    【讨论】:

    • +1 感谢您的解释,为了更好地解释,我明确的问题是:很可能首先调用函数 a,但为什么呢?
    • 谢谢,我认为这完全取决于 JS 引擎。我想说的是,唯一的测试方法是在不同的操作系统上使用所有不同的浏览器。
    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2011-12-20
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多