Chrome 是三巨头(IE、Firefox、Chrome)中最后一个反对在“主线程”(Firefox 称之为)上运行同步 XMLHttpRequest 调用的。一些浏览器还完全取消了在主线程上为同步请求设置 .widthCredentials 选项的能力。
广泛搜索后,我找不到足够的信息来准确识别哪些代码将在主线程上运行,哪些不会。
很明显,通过脚本标签(内联或带有 src)包含的 javascript 在主线程上。 在异步 XHR 的回调中运行的同步 XHR 不会在主线程上运行。
但是其他场景呢?鼠标事件、触摸事件、各种文档事件?不尝试一切怎么知道?最好避免让一切都变得异步和回调 hell 。
请尝试彻底回答。
编辑: W3C spec warning : 当 JavaScript 全局环境是文档环境时,开发人员不得为异步参数传递 false,因为它会对最终用户的体验产生不利影响。强烈建议用户代理在开发人员工具中警告此类用法,并可能会尝试在发生时抛出“InvalidAccessError”异常,以便最终从平台中删除该功能。
编辑 2: 澄清:
在某些情况下,调用代码必须等待所有竞速同步异步调用完成(对每个调用使用一些计数器或状态跟踪变量),或者使用回调将它们链接起来。每种情况都很糟糕。例如,我有一个 JSONRPC 客户端,它需要通过询问反射 API 来动态创建可调用函数。
让所有实现代码(UI 或 NOT)都在另一个库的回调中运行,特别是如果它必须在多个页面上完成,并且如果库必须表现得像一个简单的定义(隐藏在定义时间运行的代码)。 这只是复杂性的一个例子,我并不是要解决它,而是要对浏览器如何决定哪个是主线程有一个大致清晰的解释。
最佳答案
正如您引用的 W3C spec , 很容易解释你在寻找什么:
Developers must not pass false for the async argument when the JavaScript global environment is a document environment as it has detrimental effects to the end user's experience.
文档环境 的含义在 processing models 中有解释。 :
This specification describes three kinds of JavaScript global environments: the document environment, the dedicated worker environment, and the shared worker environment. The dedicated worker environment and the shared worker environment are both types of worker environments.
Except where otherwise specified, a JavaScript global environment is a document environment.
因此,“文档环境”是页面的全局 JavaScript 环境,即您看到的 window。每个JS全局环境都是single-threaded .一切(实际上一切,你考虑过:鼠标事件、触摸事件、各种文档事件)都在这个环境中运行。这可能是 Gecko 认为的“主线程”。
It would be nice to avoid making everything asynchronous and a callback hell
使某些东西异步并不会从主线程转移工作。它只是推迟它,使其他事件有可能在您等待时运行。如果你想做的事情有一个异步 api(即在后台进行处理),请使用它。使一切异步。
有足够的技术(例如 promises!)可以避免回调 hell ,回调 hell 只是错误代码的标志。
将工作移出“主线程”需要您创建一个新环境 - 网络 worker 。这样一来,您可以不受干扰地执行任意数量的同步 XMLHttpRequest。
关于javascript - 哪些代码将在浏览器的主线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25755089/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的