2012-11-20 65 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文件的順序,你想加載它們。這減少了需要作爲額外獎勵的請求的數量!