Javascript超时 - 规范

时间:2012-10-04 08:16:36

标签: javascript timeout

这不仅仅是一个问题,它是一个确保Javascript超时功能的服务质量(QoS)的请求。

查看以下伪代码:

  .. start something in JS after a user action
  .. some js code
  setTimeout( function() { doSomething }, 1 );
  .. continue for longer than 1ms doing something
  .. end code for user action

  .. after 

  .. execute doSomething

我们可以确定在所有主流浏览器上,超时代码是在代码处理完第一个用户操作后完成的吗?这与延迟时间无关。

延迟时间并不重要,而是事后执行'doSomething'代码。

0延迟会发生什么?

提前感谢您在不同浏览器上的体验。

1 个答案:

答案 0 :(得分:4)

当异步事件“触发”与实际执行时不同时,由于Javascript的单线程特性。

正在评估的每个代码块在内部表示为任务队列中的任务。因此,假设在给定代码块的中间,准备异步事件以通过setTimeout()执行。如果延迟足够短,实际上没有任何东西阻止它在相同的代码块的其余部分执行之前“触发”。但是,“触发”并不意味着setTimeout处理程序实际上会中断并执行。它只是意味着它变成了任务队列上的任务。实际执行仍然必须等到它从任务队列中弹出,并且在原始代码块完成之前不会发生。

这是一个HTML5规范代码段,虽然不是所有浏览器的权威,当然是HTML5,但却是说明性的:

http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#processing-model-3

为主事件循环定义的7个步骤中的第一步是:

  1. 在其中一个事件循环的任务队列上运行最早的任务,忽略关联文档未完全处于活动状态的任务[...]
  2. 请注意,第一步是原子的。在重置环境并拾取下一个任务之前,任务必须运行完成。

    另请参阅John Resig的帖子: http://ejohn.org/blog/how-javascript-timers-work/

    所以,问你的问题:

      

    我们可以确定在所有主流浏览器上,超时代码都是在处理第一个用户操作的代码之后完成的。这与延迟时间无关。

    ......答案是肯定的,我们可以肯定。 (在vanilla案例中......我假设我们只谈论传统的单一/ UI线程,而不是谈论Web Workers的处理)。

    另外,虽然你确实提到你对延迟时间本身并不在意,但你仍然有兴趣注意“钳制时间”(强制最小延迟),这似乎是{{ 3}}