Javascript delay.promise不等待对象解析
我正在尝试使用resolve在路由内延迟加载控制器:Javascript delay.promise不等待对象解析,javascript,angularjs,promise,Javascript,Angularjs,Promise,我正在尝试使用resolve在路由内延迟加载控制器: .when('/somepage', { resolve: { load: function (loadDependencies, $q) { return loadDependencies.load(['controllers/myCtrl.js'], [], []); } }, templateUrl: 'vi
.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.then(function () {
// call back here
});
但是我无法理解如何将解析的值返回给控制器。首先-您的实际问题:如果您想在文件延迟到达时加载控制器,您应该这样做。您需要注册控制器以便延迟加载它们 关于承诺: 我是一个最大的支持者,总是在尽可能低的水平上承诺。您的代码本身使用异步信号量执行聚合-该逻辑已经通过
$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.
});
承诺不会返回值。