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

How*_*wie 7 javascript browser event-loop sails.js

我正在使用一个框架,它在页面加载时自动连接到服务器.我可以通过传递参数的选项禁用它,但混淆我行是这样:

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

我的问题是:

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

CR *_*ost 2

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

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

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

通过在加载给定 JS 的标签下面放置一个标签也可能实现类似的效果。<script>HTML 4 尚未对此进行明确标准化,但可能在新的 HTML 5 规范中隐式标准化(这是规范不同部分之间的复杂交互)。

就 HTML5 而言,看起来当前规范说有一个afterscriptexecute事件,并且load在加载任何远程脚本后立即发生一个事件(或者,如果它是内联脚本,则该load事件被安排为任务 - 我不是确定这些何时发生)。因此,您可以通过执行以下操作来保证它,而无需修改脚本:

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

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

我为您制作了一个 jsfiddle,它可用于获取不同浏览器的“指纹”,以了解外面的评估顺序。这*是 document.body.onload 事件。在我的系统上它产生:

Firefox 32.0.3 : cafdbe*
Chrome 37.0.2062 : cafd*be
IE 11.0.9600 : cafd*be
Run Code Online (Sandbox Code Playgroud)

换句话说,