Я пытаюсь написать ультра простое решение для загрузки кучи JS-файлов асинхронно. До сих пор у меня есть следующий сценарий. Однако обратный вызов иногда вызывается, когда сценарии фактически не загружаются, что вызывает ошибку, не найденную переменной. Если я обновляю страницу иногда, это просто работает, потому что я думаю, что файлы поступают прямо из кеша и, следовательно, быстрее, чем вызван обратный вызов, это очень странно?Async Загрузка файлов JavaScript с обратным вызовом
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');
});
Спасибо за любую помощь.
В каком браузере и версии вы тестируете? –
В последнем WebKit он также входит в последнюю версию браузера Chrome :( – Gcoop
Я не могу воспроизвести это с помощью Chromium 5.0.375.70, загрузив два сценария из CDN и один из localhost (содержащий функцию, необходимую для выполнения строка внутри функции обратного вызова). Но действительно ли существует флаг 'async'? Что произойдет, если вы прокомментируете' s.async = true; 'out? –