浏览器的事件循环何时开始?
When does the browser's event loop start?
我使用的是一个在页面加载时自动连接到服务器的框架。我可以通过传递options参数来禁用它,但让我困惑的是:
您可以通过在事件循环的第一个周期结束之前禁用
io.sails.autoConnect
来阻止这个初始套接字自动连接。
我的问题是:
- 事件循环的第一个周期何时结束?
- 这种行为是否在所有现代(IE9+)浏览器中相同?
- 我在库和我的入口文件之间加载了一堆脚本(在 中)。这对第一个周期结束有影响吗?
- 我如何确保我的代码在第一个周期结束之前运行?
- 这种自动连接的实现被认为是良好的实践吗?
源文件的文档更明确一些;它说"这可以通过在事件循环的第一个周期内设置io.socket.options
来禁用或配置。"
基本上发生的事情是在库中存在一个setTimeout(fn, 0)
调用,这是启动并行进程的惯用方法。然而,在JS标准中明确指出JS是单线程的:换句话说,即使setTimeout
和setInterval
是异步的,它们实际上并不是并行的,因为它们的任何代码都将与任何其他代码同时执行。所以它们要等到当前函数结束后才执行。这种排队机制被称为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>
但是我不确定script@onload
的兼容性表是什么样子的。
我给你做了一个jsfiddle,可以用来抓取不同浏览器的"指纹",以了解在野外有什么评估命令。*
是document.body.onload事件。在我的系统上,它产生:
Firefox 32.0.3 : cafdbe*
Chrome 37.0.2062 : cafd*be
IE 11.0.9600 : cafd*be
也就是说
- 如何添加类,同时开始在文本字段中输入文本
- 浏览器何时记录历史记录
- 为什么要对define.md和module.exports进行条件检查,以及条件何时通过
- 让javascript知道epub3电子书中何时播放媒体覆盖
- 希望日期开始结束于while循环中的一个房间id的一个数组
- 如何判断何时将dom节点添加到文档中
- ng模型内的ng重复的ng重复开始
- 知道何时从UIWebView中开始播放YouTube视频
- Twitter Bootstrap - 如何检测媒体查询何时开始
- 如何查找部分加载何时开始和结束
- 如何检测UIWebView何时开始选择文本
- 如何检查文档何时开始加载,document.readyState未更新
- 检测iframe何时开始加载新URL
- 浏览器的事件循环何时开始?
- Youtube检测视频何时开始播放
- Javascript闪烁背景颜色:何时停止闪烁,何时开始闪烁
- 如何检测iframe页面何时开始加载?
- 检测输入何时开始/结束聚焦
- 检测移动Safari何时因为第二个视频开始而停止播放视频
- 如何通过JavaScript知道用户何时开始或停止视频