Задать вопрос
Kasheftin
@Kasheftin

Проблема с замыканиями в javascript?

Пишу динамическую загрузку javascript-ов. Есть список названий файлов, которые нужно загрузить, и список callback-ов, которые нужно выполнить после загрузки. Типа:

onload_js = [];<br>
onload_js[onload_js.length] = {"src":"script1.js","callback":function() { callback1(); }};<br>
onload_js[onload_js.length] = {"src":["script2.js","script3.js"],"callback":function() { callback23(); }};<br>


Это значит, что нужно загрузить script1.js, после выполнить callback1, а еще нужно загрузить script2.js и script3.js, и когда оба будут загружены, выполнить callback23.



Пробегаю в цикле по всем onload_js и гружу скрипты через jquery метод $.getScript. Проблема в том, что не знаю, как правильно сделать замыкание внутри callback-а метода $.getScript.



Типа:

for (var i in onload_js) {<br>
  for (var j in onload_js[i]["src"]) {<br>
    $.getScript(onload_js[i]["src"][j],function() {<br>
      if (//Здесь проверка что все остальные скрипты загружены тоже)<br>
        onload_js[i]["callback"]();<br>
    }<br>
  }<br>
}<br>




Это без замыкания. И понятно, что параметр i внутрь безымянной функции не передается. И все не работает, потому как callback-и вызываются в том порядке как им вздумается. Но написать

$.getCode(onload_js[i]["src"][j],function(i,j) {<br>


нельзя, потому что тогда в i,j приходят переменные из ajax-ответа getCode (т.е. статус ответа и содержание файла). Если же обернуть безымянную функцию в скобки и вызвать call(i,j), то параметры i,j передаются правильно, но сами скрипты не грузятся (callback1 и callback23 не определены).



Что делать?
  • Вопрос задан
  • 3248 просмотров
Подписаться 2 Оценить 1 комментарий
Ответ пользователя Dmitry Dedukhin К ответам на вопрос (7)
@Demetros
точнее

(function(i) {
    $.getScript(onload_js[i]["src"][j],function() {
      if (//Здесь проверка что все остальные скрипты загружены тоже)
        onload_js[i]["callback"]();
    }
})(i);
Ответ написан
Комментировать