这是我的问题 - 我需要使用jQuery.getScript()动态下载几个脚本,并在加载所有脚本后执行某些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并执行回调方法。
所以我的问题 - 假设是正确的,如果没有,那么实现我想做的事情的方法是什么?
答案 0 :(得分:79)
不,JavaScript不是多线程的。它是事件驱动的,你按顺序触发事件的假设(假设它们按顺序加载)就是你将看到的。您当前的实施似乎是正确的我相信jQuery的.getScript()
会注入一个新的<script>
标记,这也应该强制它们以正确的顺序加载。
答案 1 :(得分:34)
目前JavaScript不是多线程的,但事情会在不久的将来发生变化。有new thing in HTML5名为Worker。它允许你在后台做一些工作。
但目前并非所有浏览器都支持它。
答案 2 :(得分:16)
JavaScript (ECMAScript) specification没有定义任何线程或同步机制。
此外,我们浏览器中的JavaScript引擎是故意单线程的,部分原因是允许多个UI线程同时运行会打开大量的蠕虫。所以你的假设和实施是正确的。
作为旁注,another commenter提到任何JavaScriptengine供应商都可以添加线程和同步功能,或供应商可以让用户自己实现这些功能,如本文所述:Multi-threaded JavaScript ?
答案 3 :(得分:12)
JavaScript绝对不是多线程的 - 您可以保证您使用的任何处理程序都不会被其他事件中断。任何其他事件,如鼠标点击,XMLHttpRequest返回,以及计时器将在您的代码执行时排队,并一个接一个地运行。
答案 4 :(得分:10)
不,所有浏览器只为您提供一个JavaScript线程。
答案 5 :(得分:2)
很明显,浏览器JS实现 不是多线程。
语言,JS,可以是多线程。
但问题不适用于此。
适用的是getScript()是异步的(立即返回并排队),但是,浏览器将依次执行DOM附加<script>
内容,因此您的相关JS代码将看到它们按顺序加载。这是一个浏览器功能,不依赖于JS线程或getScript()调用。
如果getScript()使用xmlHTTPRequest,setTimeout(),websockets或任何其他异步调用检索脚本,那么您的脚本将无法保证按顺序执行。但是,在所有脚本执行之后,仍会调用您的回调,因为您的&#39; len&#39;变量在一个闭包中,它通过函数的异步调用来持久化它的上下文。
答案 6 :(得分:1)
认为用“强制”,延迟脚本传递来尝试这个可能会很有趣......
脚本加载的结果符合预期;只有在最后一个脚本加载后才会触发回调。让我感到惊讶的是,触发了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 = {};';
答案 7 :(得分:0)
如果你在HTML文档中创建了许多帧,并且在每个帧中运行一个脚本,你可能会得到某种多线程,每个脚本都在主框架中调用一个能够理解这些函数结果的函数。 。
答案 8 :(得分:0)
JS一般是单线程的。然而,HTML5 Web工作者引入了多线程。阅读更多http://www.html5rocks.com/en/tutorials/workers/basics/