gpt4 book ai didi

javascript - 如何使用 RequireJS 同步加载脚本

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:21:54 24 4
gpt4 key购买 nike

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

关于javascript - 如何使用 RequireJS 同步加载脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5217349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com