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

时间:2014-09-09 23:30:21

标签: javascript browser xmlhttprequest

Chrome是最重要的三人组合(IE,Firefox,Chrome),不赞成在“主线程”上运行同步XMLHttpRequest调用(就像Firefox所说的那样)。有些浏览器还完全删除了在主线程上为同步请求设置.widthCredentials选项的功能。

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

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

但其他情况怎么样?鼠标事件,触摸事件,各种文档事件?没有尝试一切怎么说?很高兴避免让一切都异步并回调地狱。

请尝试彻底回答。

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

编辑2: 澄清:

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

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

2 个答案:

答案 0 :(得分:3)

正如您引用W3C spec一样,您可以很容易地解释您在追捕的内容:

  

当开发人员不能为async参数传递false   JavaScript全局环境就像文档环境一样   对最终用户的体验产生不利影响。

processing models

中解释了他们的意思document environment
  

本规范描述了三种JavaScript全局   环境:文档环境,专用工作者   环境和共享工作者环境。敬业的工人   环境和共享工作者环境都是工作者的类型   的环境中。

     

除非另有说明,否则JavaScript全局环境是一个   文件环境。

A"文档环境"因此是页面的全局JavaScript环境,即您看到的window。每个JS全局环境都是single-threaded。在这种环境中,所有内容(实际上,您考虑的一切:鼠标事件,触摸事件,各种文档事件)都可以运行。这可能是Gecko认为的主要线索"。

  

避免让所有异步和回调地狱

会很好

制作异步的东西不会使作品从主线程转移。它只是推迟它,使你可以在等待时运行其他事件。如果你想要做什么的异步api(即在后台进行处理),请使用它。让一切都异步。

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

将工作转移到"主线"要求您创建一个新的环境 - 一个Web工作者。在那里,您可以根据需要执行任意数量的同步XMLHttpRequests,而不会受到干扰。

答案 1 :(得分:1)

每个浏览器都可以自由地实现自己的线程模型。不同的实现将以不同的方式处理线程。

可以肯定地说,如果你要用JavaScript来阻止执行你正在做的事情你不应该这样做。即使您没有挂断用户界面,这些天的浏览器也会提示用户中止您的脚本。如果您在脚本中保持合理数量的阻止处理,则这不是问题。同步XHR是你不应该做的事情,因为它不是必需的,线程阻塞的时间是不可预测的。