这不仅仅是一个问题,它是一个确保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延迟会发生什么?
提前感谢您在不同浏览器上的体验。
答案 0 :(得分:4)
当异步事件“触发”与实际执行时不同时,由于Javascript的单线程特性。
正在评估的每个代码块在内部表示为任务队列中的任务。因此,假设在给定代码块的中间,准备异步事件以通过setTimeout()
执行。如果延迟足够短,实际上没有任何东西阻止它在相同的代码块的其余部分执行之前“触发”。但是,“触发”并不意味着setTimeout
处理程序实际上会中断并执行。它只是意味着它变成了任务队列上的任务。实际执行仍然必须等到它从任务队列中弹出,并且在原始代码块完成之前不会发生。
这是一个HTML5规范代码段,虽然不是所有浏览器的权威,当然是HTML5,但却是说明性的:
http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#processing-model-3
为主事件循环定义的7个步骤中的第一步是:
请注意,第一步是原子的。在重置环境并拾取下一个任务之前,任务必须运行完成。
另请参阅John Resig的帖子: http://ejohn.org/blog/how-javascript-timers-work/
所以,问你的问题:
我们可以确定在所有主流浏览器上,超时代码都是在处理第一个用户操作的代码之后完成的。这与延迟时间无关。
......答案是肯定的,我们可以肯定。 (在vanilla案例中......我假设我们只谈论传统的单一/ UI线程,而不是谈论Web Workers的处理)。
另外,虽然你确实提到你对延迟时间本身并不在意,但你仍然有兴趣注意“钳制时间”(强制最小延迟),这似乎是{{ 3}}