javascript - 使用 jQuery 动态加载 JavaScript 类文件时如何避免执行延迟竞争条件?

标签 javascript jquery

我现在有大约六个 JS 类文件。我没有放入一堆标签,而是使用 jQuery 动态加载它们——按顺序——就像这样:

var classes = ["A","B","C"...];
blah.load = function(callback) {
    for (var i in classes) {
        console.log("Loading "+blah.RootURL+"/"+classes[i]+".js");
        $.ajax({
            async: true,
            url: blah.RootURL+"/"+classes[i]+".js",
            dataType: "script",
            error: function(jqxhr, status, error) {
                console.log("Unable to load "+classes[i]+": "+status+", "+error);
            },
            success: function(data, status, xhr) {
                if (window.tmpLoadCount) {
                    window.tmpLoadCount++;
                } else {
                    window.tmpLoadCount = 1;
                }

                if (window.tmpLoadCount == classes.length) {
                    console.log("Initializing...");
                    callback();
                }
            }
        });
    }
};

目前我正在使用多个脚本标签,这样我就可以继续工作。我在使用 jQuery 方法时遇到的问题是,有时,当 [重新] 加载时,以前的脚本似乎没有在加载下一个脚本之前执行(或完成执行),即使使用 async: true 也是如此。 .我的类(class)非常简短。我会通过“加载”日志看到脚本加载,但后来看到类似“无法加载 B:A 不是构造函数”的错误(如果 B 继承自 A),这向我暗示 A 不完全在 B.prototype=new A(); 时加载行被执行。

我在网上找到了一个引用资料,建议添加一个 setTimeout()调用引擎一些时间,并建议这只发生在处理 jQuery 的“成功”回调中的东西时......不幸的是,我不确定如何确保在不使用成功回调的情况下以动态方式按顺序加载所有内容.

除了许多<script/>标签或缩小(这使得调试更难)或需要类更改,有没有人对如何彻底避免这种“竞争条件”有建议?我目前不太喜欢的想法是让每个类文件的最后一行将其类名添加到全局静态属性,并让 ajax 调用使用一个时间间隔来检查该属性以确定它是否应该加载下一个文件……呸。

最佳答案

RequireJS其实就是为这种情况设计的。你应该认真考虑使用它。我个人认为this blog post by Aaron Hardy比他们自己的文档中实际包含的内容更好、更短、更清楚地描述 RequireJS 是什么以及如何使用它。您可能需要花几分钟时间通读一遍,我认为您会发现这是一个非常好的解决方案。

关于javascript - 使用 jQuery 动态加载 JavaScript 类文件时如何避免执行延迟竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10176609/

相关文章:

javascript - 哪个事件应该用于按钮?

php - 我只想使用 jquery 向右(水平)滑动而不切换 ul li 元素

javascript - 多个按钮单击事件 Jquery On

javascript - 如何使用javascript使div或对象逐渐移动到鼠标点击点?

javascript - 表单上的两个提交事件处理程序。一个必须阻止另一个

javascript - AngularJS - Uncaught Error : [$injector:nomod]

javascript - endingItem.callback 不是一个函数吗?

javascript - 知道 HTML 标签是否有文本节点

菜单中的 jQuery 幻灯片不适用于 drupal

javascript - 如何在动态生成的 HTML 表中停止递归