2011-10-25 14 views
1

ユーザーが必要とするまで特定のスクリプトのロードを避けようとしていますが、if ... elseを使用してcontinueコードを呼び出すパターンになってしまいます。両方の場所。下のコードでは、continueProcessing()メソッドの2つの呼び出しを見ることができます。これを行うより良い方法はありますか?javascript外部ファイルをロードして処理を続行する

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


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

より良いコードは、2回ではなく1回continueProcessing()を呼び出します。 –

+0

私は気にしません。それはちょうど私に見えませんが、私が考えることができる唯一の他のものは、ループ内のタイマーを使用しているとそれは悪いようです。私は間違いなくこれを過度に複雑にしたくないし、それが得られるほど簡単だ。 – Jay

答えて

0

これは私にそれをする良い方法のようです。

1

私はgetScriptを使用していませんが、htmlテンプレートの読み込みで同様の問題に直面しています。私は延期/約束のアプローチを使用してきました。それはあなたのケースのために次のようになります。スクリプトはすでにjqXHRのvarが延期されることはありませんので、「それから」すぐに実行され、存在する場合には

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

を。

これはまだ入力するコードですが、少なくとも「continueProcessing」は1回だけ表示されます。

+0

jqXHRオブジェクトがすでにpromiseインタフェースを実装しているため、ただ1つのjqXHRを持つ場合は、 '$ .when'を使用する必要はありません。 'jqXHR'をオブジェクトとして初期化する必要もなく、' null'を使うのが良いでしょう。 – ThiefMaster

+0

ありがとうございます。テンプレートは必要に応じてロードしてキャッシュする別の領域ですので、確実に適用されます。私はjqXHRを見たことがありますが、私はそれに注意を払っていません。クイックグーグルは、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 ... thenが起動しない場合、遅延ステートメントはヒットしません。私はそれが悪いことを知っているが、試して...キャッチ...最終的に私がここで欲しいものをまさにやるだろう。 – Jay

関連する問題