javascript – 如何与RequireJS同步加载脚本

我在ASP.NET中使用RequireJS.有一个用户控件包含一个脚本文件,并注册一个启动脚本以初始化自己.这是生成的代码:

<script src="script/UserControls/myctrl.js" type="text/javascript"></script>

<script type="text/javascript">
function myCtrl1_init() {
    // initialize control
    // *JS ERROR* because myctrl.js hasn't run yet
    Sys.Application.remove_load(myCtrl1_init);
}
Sys.Application.add_load(myCtrl1_init);
</script>

myctrl.js文件看起来像这样:

require(['script/dep1', 'script/dep2'], function(dep1, dep2) {      
    MyCtrl = function () {
    };
    MyCtrl.init = function(id) {
        dep1.doSomething();
    }
};

所以,问题是启动脚本在myctrl.js文件有机会运行之前运行.目前,require调用使用了一个回调函数,显然直到稍后才会运行,这就是问题…脚本返回并且浏览器在创建MyCtrl之前继续启动脚本.

我试过简单地调用require([‘script / dep1′,’script / dep2’]);在文件的顶部,但也不会阻止,并且脚本失败,因为尚未加载依赖项.顺便说一句,依赖关系是模块,例如他们使用define().

有没有办法与RequireJS同步加载脚本文件? API文档说“在具有同步加载的服务器端JavaScript环境中使用RequireJS应该像重新定义require.load()一样简单”,但我不知道这意味着什么.

有什么建议?

最佳答案 我假设require.js的脚本标记高于你提到的内容.如果是这样,那么我将myctrl.js转换为一个模块(使用“define(‘myctrl’,….)”而不是“require(..”在其中),然后在内联脚本标签内容中做一些事情喜欢:

<script type="text/javascript">
require(["myctrl"], function () {
    function myCtrl1_init() {
        // initialize control
        // *JS ERROR* because myctrl.js hasn't run yet
        Sys.Application.remove_load(myCtrl1_init);
    }
    Sys.Application.add_load(myCtrl1_init);
});
</script>

我不熟悉ASP.NET,因此我不确定在DOMContentLoaded之后可能触发的回调中执行那些Sys.Application调用是否可行,但以上是一般的想法.

无法在浏览器中使用RequireJS同步加载脚本,需要使用上面的回调方法. require.load()信息适用于希望生成在同步环境(基本上是非浏览器JS环境)中运行的RequireJS适配器的开发人员.

点赞