我使用Dojo 1.7.2中的AMD loader创建了以下Dojo widget。
在上面的示例中,在最后一个语句中,变量'myCpane'未定义。如果我在'require()'回调函数内部使用'myCpane.startup()',那么它就能正常工作。
但我想要在'require'函数外部使用该'myCpane'变量(由于许多原因)。我知道'require()'回调函数的执行由于Dojo的组件加载过程而被延迟了。
我的问题是:
1. 如何阻止'require()'函数直到它完成执行它的回调函数为止。
这样,在'require()'函数之后,变量'myCpane'不会是'undefined'。
===========================================================
为了解决这个问题,我编写了一个小函数来加载模块并等待模块加载完成。
该函数的输出总是在执行while循环,控制流程从未进入'require()'的回调函数来将值设置为变量"moduleObject"。
' require()'函数何时调用其回调函数?我已经使用浏览器调试器窗口验证了文件' ContentPane.js '已正确加载,但回调函数未被调用。如果我注释while循环,则回调将被正确调用。
在我的情况下,控制何时进入回调函数?
var myCpane;
require([
"dijit/layout/ContentPane"
], function(ContentPane) {
myCpane = new ContentPane();
});
myCpane.startup(); // It gives 'myCpane' as undefined
在上面的示例中,在最后一个语句中,变量'myCpane'未定义。如果我在'require()'回调函数内部使用'myCpane.startup()',那么它就能正常工作。
但我想要在'require'函数外部使用该'myCpane'变量(由于许多原因)。我知道'require()'回调函数的执行由于Dojo的组件加载过程而被延迟了。
我的问题是:
1. 如何阻止'require()'函数直到它完成执行它的回调函数为止。
这样,在'require()'函数之后,变量'myCpane'不会是'undefined'。
===========================================================
为了解决这个问题,我编写了一个小函数来加载模块并等待模块加载完成。
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循环,控制流程从未进入'require()'的回调函数来将值设置为变量"moduleObject"。
' require()'函数何时调用其回调函数?我已经使用浏览器调试器窗口验证了文件' ContentPane.js '已正确加载,但回调函数未被调用。如果我注释while循环,则回调将被正确调用。
在我的情况下,控制何时进入回调函数?
ContentPane.js
被加载,但是加载器的回调函数在LoadModule
函数结束之前不会被执行,而由于您的while
“忙碌循环”,这永远不会发生。你应该改变思考方式,因为你无法改变 JavaScript 的工作方式。 - phusick