2011-10-25 67 views
1

所以我試圖避免加載某些腳本,直到用戶需要它們,但我一直在使用if ... else模式,並將調用繼續代碼兩地。在下面的代碼中,您可以看到對continueProcessing()方法的兩個調用。有沒有更好的方法來做到這一點?JavaScript加載外部文件並繼續處理

if (typeof sessionList === "undefined" || typeof sessionList != "function") { 
    $.getScript('resources/sessionList.js', function() { 
    continueProcessing(); 
    }); 
} else { 
    continueProcessing(); 
} 


function continueProcessing() { 
    // do stuff 
} 
+1

更好的方式意味着更少的代碼和調用continueProcessing()一次而不是兩次? –

+0

我不知道。這對我來說看起來不太合適,但我能想到的唯一的另一件事是在循環中使用計時器,這看起來更糟糕。我絕對不想讓這個過於複雜,而且這個過程很簡單。 – Jay

回答

0

這看起來好像是對我這樣做的好方法。

1

我還沒有使用getScript,但已經面臨加載html模板類似的挑戰。我一直在使用延遲/承諾方法。它看起來像這樣爲你的情況:

var jqXHR = {}; 
if (typeof sessionList === "undefined" || typeof sessionList != "function") { 
    jqXHR = $.getScript('resources/sessionList.js'); 
} 
$.when(jqXHR).then(continueProcessing()); 

在腳本中已經存在的情況下,jqXHR VAR將不會是一個延遲,所以「然後」立即執行。

這仍然是一個鍵入的代碼,但至少「continueProcessing」只出現一次。

+0

如果您只有一個jqXHR,則不需要使用'$ .when',因爲jqXHR對象已經實現了promise接口。並且不需要初始化'jqXHR'作爲對象 - 更好地使用'null'。 – ThiefMaster

+0

感謝您的支持。模板是我根據需要加載和緩存的另一個區域,所以它絕對適用。我見過jqXHR,但我從未關注它。 Google的一個快速表明,Deferred正在取代jqXHR。對此有何想法? – Jay

0

所以我玩了$ .Deferred模式/代碼,我想出了這個。這不是簡單的,但我認爲這是一個更乾淨的方式。看起來像我有很多代碼重構...

var dfd = $.Deferred(); 

    if (typeof sessionList === "undefined" || typeof sessionList != "function") { 
     $.getScript('resources/sessionList.js', function(){ 
      dfd.resolve(); 
     }); 
    } 

    dfd.done(function() { 
     continueProcessing(); 
    }); 
+0

我是個白癡。如果if ...則不會觸發,則延遲語句不會被觸發。我知道這很糟糕,但嘗試......趕上......終於做到了我想要的東西。 – Jay