哪些代码将在浏览器的主线程上运行?

Tib*_*tan 6 javascript browser xmlhttprequest

Chrome是大三人组(IE,Firefox,Chrome)中最后一个不赞成在"主线程"上运行同步XMLHttpRequest调用的人(就像Firefox所说的那样).某些浏览器还完全删除了.widthCredentials在主线程上设置同步请求选项的功能.

经过远距离搜索后,我找不到足够的信息来精确识别哪些代码将在主线程上运行,哪些代码不会.

很明显,通过脚本标记(内联或使用src)包含的javascript位于主线程上.并且在异步XHR的回调内运行的同步XHR将不会在主线程上运行.

但其他场景呢?鼠标事件,触摸事件,各种文档事件?没有尝试一切怎么说?避免让一切都异步并回调地狱会很好.

请尝试彻底的答案.

编辑: W3C规范警告:当JavaScript全局环境是文档环境时,开发人员不得为async参数传递false,因为它会对最终用户的体验产生不利影响.强烈建议用户代理在开发人员工具中警告这种用法,并尝试在其发生时抛出"InvalidAccessError"异常,以便最终可以从平台中删除该功能.

编辑2: 澄清:

在某些情况下,调用代码必须等待所有竞争同步异步调用完成(使用一些计数器或状态跟踪变量来进行每次调用),或者使用回调链接它们.每种情况都很糟糕.例如,我有一个JSONRPC客户端需要通过查询反射API来动态创建可调用函数.

让所有实现代码(UI或NOT)在另一个库的回调中运行是有利的,特别是如果它必须在多个页面上完成,并且库必须表现为一个简单的定义(隐藏那是在定义时运行代码).这只是复杂性的一个例子,我不是要求它的解决方案,而是对浏览器如何决定哪个是主线程的一般清晰解释.

Ber*_*rgi 5

正如您引用了W3C 规范,很容易解释您正在寻找的内容:

当 JavaScript 全局环境是文档环境时,开发人员不得为 async 参数传递 false,因为它会对最终用户的体验产生不利影响。

它们的含义在处理模型document environment中进行了解释:

本规范描述了三种 JavaScript 全局环境:文档环境、专用工作环境和共享工作环境。专用工作人员环境和共享工作人员环境都是工作人员环境类型。

除非另有说明,JavaScript 全局环境是文档环境。

因此,“文档环境”是页面的全局 JavaScript 环境,即window您所看到的。每个 JS 全局环境都是单线程的。一切(实际上是一切,你考虑过:鼠标事件、触摸事件、各种文档事件)都在这个环境中运行。这可能就是 Gecko 认为的“主线程”。

最好避免让所有事情都异步和回调地狱

使某些内容异步并不会转移主线程的工作。它只是推迟它,使得在您等待时可以运行其他事件。如果有一个异步 API 可以满足您的要求(即在后台进行处理),请使用它。使一切异步。

有足够的技术(例如承诺!)来避免回调地狱,这只是糟糕代码的标志。

将工作从“主线程”转移出去需要您创建一个新环境 - Web Worker。这样,您可以根据需要执行任意数量的同步 XMLHttpRequest,而不会受到干扰。