Dojo 1.7.2 で AMD ローダーを使用して、以下のような Dojo ウィジェットを作成しました。
var myCpane;
require([
"dijit/layout/ContentPane"
], function(ContentPane) {
myCpane = new ContentPane();
});
myCpane.startup(); // It gives 'myCpane' as undefined
上記の例では、最後のステートメントで変数「myCpane」が「未定義」になっています。「require()」コールバック関数内で「myCpane.startup()」を使用すると、正常に動作します。
しかし、私はその「myCpane」変数を「require」関数の外側で使用したいと考えています(多くの理由から)。Dojo によるコンポーネントのロード プロセスが原因で、'require()' コールバック関数の実行が遅れていることはわかっています。
私の質問は、
- コールバック関数の実行が完了するまで「require()」関数をブロックする方法。
したがって、変数「myCpane」は、コントロールが「require()」関数から出たときに「未定義」にはなりません。
================================================== =========
この問題を克服するために、モジュールをロードし、モジュールのロードが完了するまで待機する小さな関数を作成しました。
LoadModule: function(modulePath) { // modulePath = "dijit/layout/ContentPane"
var moduleObject = undefined;
require({async: false}, [modulePath], function(getModuleObject) {
moduleObject = getModuleObject;
});
// Wait until the module loads completes
while(moduleObject === undefined);
// Return the loaded module.
return moduleObject;
}
関数の出力は常に while ループを実行しており、変数「moduleObject」に値を設定するために、コントロールが「require()」のコールバック関数内に入ることはありません。
「require()」関数がコールバック関数を呼び出すのはいつですか? ブラウザー デバッガー ウィンドウを使用して、ファイル 'ContentPane.js' が正しく読み込まれていることを確認しましたが、コールバック関数が呼び出されません。while ループをコメントすると、コールバックが正しく呼び出されます。
私の場合、コントロールがコールバック関数の中に入るのはいつですか?