2014-10-27 2 views
0

Я пытаюсь контроллеры ленивой нагрузки внутри маршрута с помощью постановляют:defer.promise не дожидаясь объект, чтобы решить

.when('/somepage', { 
     resolve: { 
      load: function (loadDependencies, $q) { 
       return loadDependencies.load(['controllers/myCtrl.js'], [], []); 

      } 
     }, 
     templateUrl: 'views/some-template.html' 
    }) 

Вот мой loadDependencies завод:

app.factory('loadDependencies', function ($q, $timeout) { 

    return { 
     load: function (Controllers,cssFiles,modules) { 

      var jsPath = "scripts/", 
       cssPath = "css/", 
       head = document.getElementsByTagName("head")[0], 
       deffered = $q.defer(), 
       jsReady = 0, 
       jsShouldBeReady = Controllers.length; 

      Controllers.forEach(function (arrayItem) { 
       var js = document.createElement("script"); 
       js.src = jsPath + arrayItem; 
       head.appendChild(js); 

       js.onload = function() { 
        jsReady++; 
        if (jsReady == jsShouldBeReady) { // if loaded files equal to controllers length, then they all finished loading - so resolve deffered 
         deffered.resolve(true); 
        } 
       }; 

       js.onerror = function() { 
        alert("Cannot load js files. Pleae try again later"); 
       }; 
      }); 

      return deffered.promise; 

     } 
    } 
}); 

Я новый к угловому, но из моего понимания - deffered.promise должен ждать обещания разрешить? в настоящее время он просто возвращает объект. Я также пробовал это:

deffered.promise.then(function() { 
    // call back here 
}); 

Но я не понимаю, как вернуть возвращаемое значение обратно контроллеру.

+0

Обещания сделать не 'return' значения. – Bergi

ответ

1

Во-первых - ваша фактическая проблема: если вы хотите загрузить контроллер, когда файл прибывает лениво, вы должны read this. Вам нужно зарегистрировать свои контроллеры, чтобы их ленивая загрузка.

Что касается обещаний:

Я большой сторонник всегда promisifying на самом низком возможном уровне. Ваш код сам выполняет агрегацию с асинхронным семафором - эта логика уже реализована для вас через $q.all, что делает то же самое, только с лучшей обработкой ошибок.

function loadScript(url){ 
    var scr = document.createElement("script"); 
    scr.src = url; 
    var d = $q.defer(); 
    scr.onload = function(){ d.resolve(scr); }; 
    scr.onerror = function(e){ d.reject(e); }; 
    return d.promise; 
} 

Этот код довольно ясно, теперь, вы можете загрузить несколько обещаний и ждать их через $q.all:

function load(files){ 
    return $q.all(files.map(loadScript)); 
} 

load([url1, url2, url2]).then(function(){ 
    // all files are loaded, just like in your example. 
}); 
Смежные вопросы