And*_*rey 56 javascript jquery
这是我的问题 - 我需要使用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()
})
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们假设每个脚本的script.onload事件触发并按顺序和同步执行,那么这只能可靠地工作,所以当两个或多个事件处理程序通过检查(len == 0)并执行时,永远不会出现这种情况.回调方法.
所以我的问题 - 这个假设是正确的,如果没有,那么实现我想做的事情的方法是什么?
gna*_*arf 81
不,JavaScript不是多线程的.它是事件驱动的,你按顺序触发事件的假设(假设它们按顺序加载)就是你将看到的.您当前的实施似乎是正确的 我相信jQuery会.getScript()
注入一个新<script>
标签,这也应该强制它们以正确的顺序加载.
Jef*_*nal 16
所述的JavaScript(ECMAScript的)规范没有定义任何线程或同步机制.
此外,我们浏览器中的JavaScript引擎故意是单线程的,部分原因是允许多个UI线程同时运行会打开大量的蠕虫.所以你的假设和实施是正确的.
作为旁注,另一位评论者提到,任何JavaScriptengine供应商都可以添加线程和同步功能,或者供应商可以让用户自己实现这些功能,如本文所述:多线程JavaScript?
Dan*_*ego 12
JavaScript绝对不是多线程的 - 您可以保证您使用的任何处理程序都不会被另一个事件中断.任何其他事件,如鼠标单击,XMLHttpRequest返回和计时器将在您的代码执行时排队,并一个接一个地运行.
需要明确的是,在浏览器JS实现是不是多线程。
在语言,JS,可以多线程。
然而,这个问题不适用于这里。
适用的是 getScript() 是异步的(立即返回并排队),但是,浏览器将按<script>
顺序执行 DOM 附加内容,因此您的依赖 JS 代码将看到它们按顺序加载。这是浏览器功能,不依赖于 JS 线程或 getScript() 调用。
如果 getScript() 使用 xmlHTTPRequest、setTimeout()、websockets 或任何其他异步调用检索脚本,则不能保证您的脚本按顺序执行。但是,在所有脚本执行后,您的回调仍会被调用,因为“len”变量的执行上下文位于一个闭包中,该闭包通过对函数的异步调用来保持其上下文。