Chrome是最重要的三人组合(IE,Firefox,Chrome),不赞成在“主线程”上运行同步XMLHttpRequest调用(就像Firefox所说的那样)。有些浏览器还完全删除了在主线程上为同步请求设置.widthCredentials
选项的功能。
经过远距离搜索后,我找不到足够的信息来准确识别哪些代码将在主线程上运行,哪些代码不会。
很明显,通过脚本标记(内联或使用src)包含的javascript位于主线程上。 并且在异步XHR的回调内运行的同步XHR将不会在主线程上运行。
但其他情况怎么样?鼠标事件,触摸事件,各种文档事件?没有尝试一切怎么说?很高兴避免让一切都异步并回调地狱。
请尝试彻底回答。
修改 W3C spec warning: 当JavaScript全局环境是文档环境时,开发人员不得为异步参数传递false,因为它会对最终用户的体验产生不利影响。强烈建议用户代理在开发人员工具中警告这种用法,并尝试在其发生时抛出“InvalidAccessError”异常,以便最终可以从平台中删除该功能。
编辑2: 澄清:
在某些情况下,调用代码必须等待所有竞争同步异步调用完成(使用一些计数器或状态跟踪变量对每个调用),或者使用回调链接它们。每种情况都很糟糕。例如,我有一个需要的JSONRPC客户端,通过询问反射API来动态创建可调用函数。
让所有实现代码(UI或NOT)在另一个库的回调中运行是有利的,特别是如果它必须在多个页面上完成,并且库必须表现得像一个简单的定义(隐藏在定义时运行代码)。 这只是复杂性的一个例子,我不是要求它的解决方案,而是对浏览器决定哪个是主线程的一般清晰解释。
答案 0 :(得分:3)
正如您引用W3C spec一样,您可以很容易地解释您在追捕的内容:
中解释了他们的意思当开发人员不能为async参数传递false JavaScript全局环境就像文档环境一样 对最终用户的体验产生不利影响。
document environment
本规范描述了三种JavaScript全局 环境:文档环境,专用工作者 环境和共享工作者环境。敬业的工人 环境和共享工作者环境都是工作者的类型 的环境中。
除非另有说明,否则JavaScript全局环境是一个 文件环境。
A"文档环境"因此是页面的全局JavaScript环境,即您看到的window
。每个JS全局环境都是single-threaded。在这种环境中,所有内容(实际上,您考虑的一切:鼠标事件,触摸事件,各种文档事件)都可以运行。这可能是Gecko认为的主要线索"。
避免让所有异步和回调地狱
会很好
制作异步的东西不会使作品从主线程转移。它只是推迟它,使你可以在等待时运行其他事件。如果你想要做什么的异步api(即在后台进行处理),请使用它。让一切都异步。
有足够的技巧(例如承诺!)来避免回调地狱,这只是代码不好的标志。
将工作转移到"主线"要求您创建一个新的环境 - 一个Web工作者。在那里,您可以根据需要执行任意数量的同步XMLHttpRequests,而不会受到干扰。
答案 1 :(得分:1)
每个浏览器都可以自由地实现自己的线程模型。不同的实现将以不同的方式处理线程。
可以肯定地说,如果你要用JavaScript来阻止执行你正在做的事情你不应该这样做。即使您没有挂断用户界面,这些天的浏览器也会提示用户中止您的脚本。如果您在脚本中保持合理数量的阻止处理,则这不是问题。同步XHR是你不应该做的事情,因为它不是必需的,线程阻塞的时间是不可预测的。