浏览器的事件循环何时开始?

时间:2014-08-07 08:46:34

标签: javascript browser sails.js event-loop

我正在使用一个框架,它在页面加载时自动连接到服务器。我可以通过传递选项参数来禁用它,但让我感到困惑的是this

  

您可以通过在事件循环的第一个循环过去之前禁用io.sails.autoConnect来阻止此初始套接字自动连接。

我的问题是:

  1. 事件循环的第一个循环何时结束?
  2. 在所有现代(IE9 +)浏览器中,此行为是否相同?
  3. 我在lib和我的条目文件之间加载了一堆脚本(在< body>中)。第一个周期过去会影响这个吗? 编辑:是的,确实如此。
  4. 如何确保我的代码在第一个周期结束之前运行?
  5. 这种自动连接的实现是否被视为良好做法?

1 个答案:

答案 0 :(得分:2)

源文件的文档更加明确;它说“可以通过在事件循环的第一个周期内设置io.socket.options来禁用或配置它。”

基本上发生的事情是,库中存在setTimeout(fn, 0)调用,这对于启动并行进程来说是惯用的。但是,在JS标准中明确指出JS是单线程的:换句话说,即使setTimeoutsetInterval 异步,它们实际上并不是并行,因为他们的任何代码都将与任何其他代码同时执行。所以他们等到当前函数结束才执行。这种排队机制称为JavaScript事件循环。

相信脚本作者要求您做的是修改源以包含相关更改,可能位于文件底部方便。

也可能可能通过在加载给定JS的那个标记下放置一个<script>标记来实现类似的效果。这还没有被HTML 4明确标准化,但可能在新的HTML 5规范中隐式标准化(这是规范的不同部分之间的复杂交互)。

就HTML5而言,the current specs say看起来像afterscriptexecute事件和load事件在加载任何远程脚本后立即发生(或者,如果它是内联的话)脚本,load事件被安排为任务 - 我不确定何时发生这些事件。因此,您可以在不修改脚本的情况下通过以下方式保证它:

<script>
function do_not_autoload() { /* ... */ }
</script>
<script onload="do_not_autoload()" src="./path/to/sails.io.js"></script>

但我不确定script@onload的兼容性表格是什么样的。

我让你a jsfiddle可以用来抓取不同浏览器的“指纹”,以了解外面的评估订单。 *是document.body.onload事件。在我的系统上它产生:

Firefox 32.0.3 : cafdbe*
Chrome 37.0.2062 : cafd*be
IE 11.0.9600 : cafd*be

换句话说,