JavaScriptmultithreading?
这是我的问题 – 我需要使用jQuery.getScript()dynamic下载几个脚本,并在所有脚本加载后执行某些JavaScript代码,所以我的计划是做这样的事情:
function GetScripts(scripts, callback) { var len = scripts.length for (var i in scripts) { jQuery.getScript(scripts[i], function() { len --; // executing callback function if this is the last script that loaded if (len == 0) callback() }) } }
如果我们假设每个脚本的script.onload事件触发并按顺序同步执行,这只会可靠地工作,所以当两个或两个以上的事件处理程序通过检查(len == 0)并执行callback方法。
所以我的问题是 – 这个假设是否正确,如果不是的话,那么我想要做什么?
不,JavaScript不是multithreading的。 这是事件驱动的,你对事件顺序触发的假设(假设它们按顺序加载)是你将会看到的。 您当前的实施显示正确。 我相信jQuery的.getScript()
注入一个新的<script>
标签,这也应该强制他们加载正确的顺序。
目前JavaScript不是multithreading的,但事情将在不久的将来改变。 在HTML5中有一个叫做Worker的新东西 。 它可以让你在后台做一些工作。
但目前并不支持所有的浏览器。
JavaScript(ECMAScript)规范没有定义任何线程或同步机制。
而且,我们的浏览器中的JavaScript引擎是故意单线程的,部分原因是允许多个UI线程同时运行会打开一大堆蠕虫。 所以你的假设和实施是正确的。
作为一个旁注, 另一位评论者提到,任何JavaScriptengine供应商都可以添加线程和同步function,或者供应商可以让用户自己实现这些function,如本文所述: multithreadingJavaScript ?
JavaScript是绝对不是multithreading的 – 你有一个保证,你使用的任何处理程序不会被其他事件中断。 任何其他事件,例如鼠标点击,XMLHttpRequest返回和计时器将在您的代码执行时排队,并且一个接一个地运行。
不,所有的浏览器只给你一个JavaScript的线程。
要清楚的是, 浏览器的JS实现 不是multithreading的 。
语言JS可以是multithreading的 。
这个问题不适用于此。
什么适用的是,getScript()是asynchronous的(立即返回,并得到排队),但是,浏览器将执行DOM附加<script>
内容顺序,所以你的依赖JS代码将看到他们顺序加载。 这是一个浏览器function,不依赖于JS线程或getScript()调用。
如果getScript()使用xmlHTTPRequest,setTimeout(),websockets或任何其他asynchronous调用检索脚本,那么您的脚本将不能保证按顺序执行。 但是,由于您的“len”variables的执行上下文位于一个闭包中,因此您的callback将在所有脚本执行后仍然被调用,该闭包通过函数的asynchronous调用来保持其上下文。
认为尝试使用“ 强制 ”,延迟的脚本交付可能会很有趣。
- 从谷歌添加两个可用的脚本
- 添加了delayjs.php作为第二个数组元素。 在传递一个空的js对象之前,delayjs.php会hibernate5秒钟。
- 添加了一个callback,从脚本文件中“ validation ”预期对象的存在。
- 在调用GetScripts()之后添加了一些在线上执行的js命令,来“ testing ”连续的js命令。
脚本加载的结果如预期的那样; 只有在加载了最后一个脚本之后才会触发callback。 让我感到惊讶的是,不需要等待最后一个脚本的加载,就触发了GetScripts()调用之后的js命令。 我的印象是,没有js命令将被执行,而浏览器正在等待一个js脚本加载…
var scripts = []; scripts.push('http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js'); scripts.push('http://localhost/delayjs.php'); scripts.push('http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js'); function logem() { console.log(typeof Prototype); console.log(typeof Scriptaculous); console.log(typeof delayedjs); } GetScripts( scripts, logem ); console.log('Try to do something before GetScripts finishes.\n'); $('#testdiv').text('test content'); <?php sleep(5); echo 'var delayedjs = {};';
如果您在HTML文档中创build了多个框架,并且在每个框架中都运行了一个脚本,那么您可能会获得某种multithreading化,每个脚本都在主框架中调用一个函数,以便理解这些函数的结果。
JS一般是单线程的。 但是HTML5 Web工作者引入了multithreading技术。 阅读更多信息, 请访问http://www.html5rocks.com/en/tutorials/workers/basics/