2016-05-18 10 views
1

プロジェクトにjsファイルがたくさんあります。ファイルが既にロードされているかどうかをテストするrequire関数を作成したいと思います。私はrequirejsを認識していますが、私は何か小さなものをやりたいと思っています。私の関数の問題は、requiresの呼び出しでエラーwidgets is undefinedがスローされることです。どうすればそれを防ぐことができますか?別のファイルからオブジェクトを定義する必要があります

function requires(obj, fn){ 
     if(typeof obj === 'undefined'){ 
      log('obj undefined'); 
      window.setTimeout(function(){requires(obj, fn)}, 10); 
      //10 ms is arbitrary, i'm not a fan of that 
     }else{ 
      fn(); 
     } 
    } 

//example using it 
requires(widgets, function(){ 
    window.widgets.showUserDlg = function showUserDlg(data) { 
      ... 
     } 
    } 
}); 
+0

これは 'else'条件になり、' fn() 'はコールバックを' widgets'で実行します。最初にAJAXによって 'widgets'ファイルを取得する必要がありますか? –

+0

未定義のパラメータを関数に渡すことはできません**、常にエラーを投げます。[ここ](http://stackoverflow.com/a/16942951/3880255)を参照してください。動作しません。設定した環境に応じてコードを調整する必要があります。 –

答えて

1

widgetsは、グローバル変数やオブジェクトのプロパティである場合、あなたは

requires('widgets', function() { /* ... */ }); 

のような文字列名として渡すと、それを確認するために配列としてwindowまたはそのオブジェクトを使用することができます。

function requires(obj, fn){ 
    if(typeof window[obj] === 'undefined'){ // or container[obj] 
     log('obj undefined'); 
     window.setTimeout(function(){requires(obj, fn)}, 10); 
     //10 ms is arbitrary, i'm not a fan of that 
    }else{ 
     fn(); 
    } 
} 
+0

グローバルな名前空間を汚染しないでください。 –

+0

@ClemensHimmerオブジェクト – Goover

+0

を使って別の可能性を追加しました。 – Ced

関連する問題