2012-11-20 64 views
0

所以这个问题是从我最近问的另一个分支,这更多的是好奇心。jQuery脚本加载队列

我的另一个问题涉及动态加载外部js库。在我的示例中,我使用了.getScript()来导入jQuery模板,然后使用Knockout.js。每次完成加载时,我都会发出警报,以确保它们正确加载。

下面是我用的是近似的代码(似乎是“为了”上的jsfiddle工作,所以它可以一直在我的代码的问题仍然有效,但。):

$.getScript("https://raw.github.com/jquery/jquery-tmpl/master/jquery.tmpl.js", function(){ alert('tmpl finished loading!'); }); 
$.getScript("http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.2.0.js", function(){ alert('Knockout finished loading!'); }); 

我发现,当我载入页面时,Knockout的警报在tmpl库之前发布,即使它列在第二位。

我的假设是他们会以队列的方式同步加载,在加载下一个之前等待前一个完成。看来情况并非如此。

所以我要求验证这个假设,并解释为什么这是/不是这种情况。我还想知道是否有另一种[更好]的方法来排队脚本加载,这样我就不会因为未加载脚本的依赖而遇到未定义的问题。

+0

记住,javascript只是继续前进,不管前一个函数是否完成。事实上,这是异步加载的定义。你实际上在想他们会同步加载。 –

+0

Woops,你是对的。我的意思是同步。 – Jon

+1

顺便说一句,'ping raw.github.com ::〜110ms','ping cloud.github.com ::〜22ms'这就是为什么第二个脚本首先被加载而不是你的代码中的东西,除了问题之外在接受的答案中概述。并感谢现在遇到它...... – dualed

回答

2

你的测试明显违背了你的假设。没有队列,它们各自同时运行。哪一个首先完成取决于文件大小,网络定时等

如果你想确保一个加载前一后,将通话时间控制在第一库的回调函数的第二个库:

$.getScript("https://raw.github.com/jquery/jquery-tmpl/master/jquery.tmpl.js", function(){ 
    alert('tmpl finished loading!'); 
    $.getScript("http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.2.0.js", function(){ 
     alert('Knockout finished loading!'); 
    }); 
}); 
+0

是的,我猜测在我的完整代码中,导致tmpl库加载速度变慢。不知道是什么。这种嵌套负载的方法相当普遍吗? – Jon

+0

也许是因为您正在使用SSL? – Barmar

+0

刚刚编辑了我的第一个评论与你的答案有关的问题。 – Jon

0

你可以但你所有的图书馆在一个单一的js文件的顺序,你想加载它们。这减少了需要作为额外奖励的请求的数量!