Асинхронная загрузка файлы JavaScript с обратным вызовом

Я пытаюсь записать крайнее простое решение для загрузки набора файлов 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);
    }
}

Должен там так или иначе протестировать это, файл 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');
    });

Спасибо за любую справку.

14
задан Aaron Harun 9 July 2010 в 14:37
поделиться

3 ответа

Насколько я могу судить, в вашем коде нет ничего плохого, это просто ошибка в Chrome (он также делает это с помощью window.onload)

Я бы добавил его в функция, которая запускается в функции «загрузка». Если переменная существует, выполните код JS, а если нет, используйте setTimeout для повторной проверки через 500 мс или около того.

2
ответ дан 1 December 2019 в 15:20
поделиться

На случай, если вы сочтете это полезным, я создал служебную библиотеку async, которая позволит вам написать приведенный выше код как:

var Loader = function () {}

Loader.prototype = {
    require: function (scripts, callback) {
        async.map(scripts, this.writeScript, callback);
    },
    writeScript: function(src, callback) {
        var s = document.createElement('script');
        s.type = "text/javascript";
        s.src = src;
        s.addEventListener('load', function (e) { callback(null, e); }, false);
        var head = document.getElementsByTagName('head')[0];
        head.appendChild(s);
    }
}

Если вы выполняете много асинхронных вызовов, у него есть несколько довольно мощных функций:)

http://caolanmcmahon.com/async.html

2
ответ дан 1 December 2019 в 15:20
поделиться

А как насчет jQuery ....

$.getScript('abc.js'); 

Приведенный выше код будет загружать файл сценария "abc.js" асинхронно ....

4
ответ дан 1 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: