2014-10-27 35 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; 

     } 
    } 
}); 

我是新角度,但從我的理解 - deferred.promise應等待承諾解決?目前它只是返回對象。我也試過這個:

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

但我沒有理解如何將解析的值返回給控制器。

+0

承諾不是'return'值。 – Bergi 2014-10-27 12:06:10

回答

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. 
});