lightarhont
@lightarhont
python/php developer

Requirejs и итерация?

Вот такой вот блок кода из приложения Backbone Marionette:
...
initialize: function(opt){
        
        var classes = [];
        for(i=0;i<opt.rightblocks.length;i++){
            require(['./project/Modules/'+opt.rightblocks[i]+'/Start',], function(){
                //var cm = Project.Classes.Modules[opt.rightblocks[i]]
                //var block = this.rightblocks[i] = Project.module(opt.rightblocks[i], Project.Classes.Modules[opt.rightblocks[i]].Start);
                //var block = this.rightblocks[i] = new opt.rightblocks[i];
                console.log(i);
                classes[i] = block.name;
                this.addRegion(block.name, '.'+block.name);
            });
        }
...


console.log(i) вместо 0 печатает 1
Но если закоментировать 'require(['./project/Modules/'+opt.rightblocks[i]+'/Start',], function(){' и 'закрывашку' - всё работает корректно.
Признаться я недавно стал использовать AMD принцип, асинхронной загрузки JS.
Но иногда нужно что-бы всё было синхронно. Как это сделать?
  • Вопрос задан
  • 280 просмотров
Решения вопроса 1
for(i=0;i<opt.rightblocks.length;i++){
	(function(i){
	    require(['./project/Modules/'+opt.rightblocks[i]+'/Start',], function(){
	        console.log(i);
	        classes[i] = block.name;
	        this.addRegion(block.name, '.'+block.name);
	    });
    })(i);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
mlnkv
@mlnkv
JavaScript Developer
видимо первый модуль из массива модулей не существует (нет такого файла) и поэтому не отрабатывает колбек
'./project/Modules/'+opt.rightblocks[0]+'/Start' // такого файла нет
Ответ написан
Ваша проблема в том, что Вы замыкаете коллбек на значение переменной i. Если коллбек не успевает отработать до конца цикла (а так и происходит), то вы в console.log будете получать всегда последнее значение i. Подробнее Почему происходит магия в JS коде?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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