请原谅这个冗长的问题,但我相信这些信息对于确定应用程序中的错误至关重要。
循环配置设置:
window.config = {
"Environments": [
"LH5",
"LH8",
"AMS"
],
"Clusters": [
4,
4,
4
]
};
循环:
for (var i = 0; i < window.config.Environments.length; i++) {
for (var j = 1; j < window.config.Clusters[i] + 1; j++) {
承诺对象声明:
promiseObj.physical[window.config.Environments[i] + "#Cluster" + j] = $http.get('url/search?idc=' + window.config.Environments[i] + '&type=Physical&cluster=' + j).success(function(i,j) {
return function(data) {
每个Promise对象都有一个额外的循环..
angular.forEach($scope.servers, function(item) {
countcores[window.config.Environments[i] + "#Cluster" + j] = parseInt(countcores[window.config.Environments[i] + "#Cluster" + j]) + parseInt(item.cores);
countmemory[window.config.Environments[i] + "#Cluster" + j] = parseInt(countmemory[window.config.Environments[i] + "#Cluster" + j]) + parseInt(item.memory);
});
结束承诺对象
}(i,j));
} } // End for loops
Q全部功能
$q.all(promiseObj).then(function(results) {
for (var i = 0; i < window.config.Environments.length; i++) {
for (var j = 1; j < window.config.Clusters[i] + 1; j++) {
alert(countvirtualcores[window.config.Environments[i] + "#Cluster" + j]);
alert(countcores[window.config.Environments[i] + "#Cluster" + j]);
}}
});
运行Q All功能时,我得到:
Error: [$rootScope:inprog] $digest already in progress
http://errors.angularjs.org/1.2.28/$rootScope/inprog?p0=%24digest
此外,我无法访问:
countvirtualcores[window.config.Environments[i] + "#Cluster" + j]
返回undefined。
问题:
a)为什么承诺对象没有按预期工作?
b)这是解决这个问题的正确方法吗?
答案 0 :(得分:1)
我认为您的承诺对象声明会出现问题。
$http
服务返回承诺,但在您的示例中,您没有返回承诺,您正在使用.success()
回调方法,并尝试返回结果。
因此,您必须构建一个promises数组,并将其传递给您的$q.all()
方法,该方法是为处理许多承诺而构建的。
我做了一个例子:
<强>控制器强>
(function(){
function Controller($scope, $q, Service) {
var promises = [];
for (var i = 1; i < 10; ++i){
//Add promises to our array
promises.push(Service.get(i));
}
$q.all(promises).then(function(response){
//Here, response is a raw array
//Retrieve response data by mapping the results
var data = response.map(function(elm){
return elm.data;
});
//Print my array data
console.log(data);
});
}
angular
.module('app', [])
.controller('ctrl', Controller);
})();
<强>服务强>
(function(){
function Service($http) {
function get(n){
//Return a promise
return $http.post('path_to_url_example', n);
}
return {
get: get
}
}
angular
.module('app')
.factory('Service', Service);
})();
所以在这里,我们将param传递给 POST 请求,然后我们就可以将这些数据检索到您的$q.all()
方法中。