如何与RequireJS同步加载脚本

时间:2011-03-07 08:18:42

标签: javascript asp.net 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()一样简单”,但我不知道这意味着什么。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我认为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适配器的开发人员。