2013-03-13 34 views
2

爲了加快速度,我的web應用程序使用jQuery的ajax調用爲某些功能按需加載JavaScript文件。不過,我遇到了一個競爭條件問題。例如,文件B.js依賴於文件A.js.我配置了一個列表,如list = [A.js,B.js],並遍歷這個列表並異步獲取腳本。我怎樣才能防止這種競爭條件?如何在加載按需JavaScript文件時防止競爭狀況?

加載JavaScript文件中的代碼是一樣的東西:

loadJS: function(url) { 
    $.ajax({url: url, dataType: 'script', success: function(){}}); 
} 
+0

將這兩個文件縮小並連接成C.js.沒有競爭條件,如果你只是拉一個文件。 – 2013-03-13 19:25:15

+0

不要使用ajax加載依賴於其他腳本的腳本? – 2013-03-13 19:25:17

+0

爲什麼不使用[requirejs](http://requirejs.org/)? – Shmiddty 2013-03-13 19:25:39

回答

2

這種依賴管理的不天昏地暗。沒有太多的關於如何正確地抽象它,如果你有一個文件的數組加載,你的ajax回調(我假設是下載js文件的內容到一個字符串)保存在另一個數組中的字符串,直到你下載所有文件的內容。一旦所有文件都在內存中,請按順序將它們添加到dom中。

你會想添加一些額外的東西,如處理失敗等,但這是如何做到這一點的大綱。

0

假設你使用異步加載文件1和2:

function load(URI) { 
    $.ajax({ 
     url: URI, 
     dataType: "script", 
    }); 
} 

和文件2對文件1的依賴然後將這些文件可以異步加載:

load(url1) 
    .then(load(url2)); 

,如果文件2沒有按「T對文件1,則依賴它們可以被加載:

$.when(load(url1), load(url2)) 
    .then(function(e) { // both scripts loaded successfully}); 
0

你可以只添加腳本標記而不是進行阿賈克斯調用:

var scripts = ['a.js', 'b.js'], 
    idx; 

for(idx in scripts) { 
    if(scripts.hasOwnProperty(idx)) { 
     document.write(['<script src="', scripts[idx], '"></script>'].join('')); 
    } 
} 

腳本將異步加載,但按照您添加它們的順序同步執行。