使用回调异步加载JavaScript文件

Gco*_*oop 14 javascript ajax design-patterns asynchronous

我正在尝试编写一个超简单的解决方案来异步加载一堆JS文件.到目前为止,我有以下脚本.但是,当脚本未实际加载时,有时会调用回调,这会导致找不到变量错误.如果我刷新页面有时它只是工作,因为我猜文件是直接来自缓存,因此比调用回调更快,这是非常奇怪的?

var Loader = function () {

}
Loader.prototype = {
    require: function (scripts, callback) {
        this.loadCount      = 0;
        this.totalRequired  = scripts.length;
        this.callback       = callback;

        for (var i = 0; i < scripts.length; i++) {
            this.writeScript(scripts[i]);
        }
    },
    loaded: function (evt) {
        this.loadCount++;

        if (this.loadCount == this.totalRequired && typeof this.callback == 'function') this.callback.call();
    },
    writeScript: function (src) {
        var self = this;
        var s = document.createElement('script');
        s.type = "text/javascript";
        s.async = true;
        s.src = src;
        s.addEventListener('load', function (e) { self.loaded(e); }, false);
        var head = document.getElementsByTagName('head')[0];
        head.appendChild(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

无论如何都要测试一个JS文件是否完全加载,而不是在实际的JS文件本身中添加一些内容,因为我想使用相同的模式来加载我的控制库(GMaps等).

在标记之前调用代码.

var l = new Loader();
l.require([
    "ext2.js",
    "ext1.js"], 
    function() {
        var config = new MSW.Config();
        Refraction.Application().run(MSW.ViewMapper, config);
        console.log('All Scripts Loaded');
    });
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Aar*_*run 2

据我所知,你的代码没有任何问题,这只是 Chrome 中的一个错误(它也使用 window.onload 执行此操作。)

我将其添加到“加载”函数中触发的函数中。如果变量存在,则执行JS代码,如果不存在,则使用setTimeout在500ms左右再次检查。