请原谅这个长问题,但我相信这些信息对于确定应用程序中的错误至关重要。
循环配置设置:
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++) {
Promise 对象声明:
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);
});
结束 Promise 对象
}(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]
返回未定义。
问题:
a) 为什么 Promise 对象没有按预期工作?
b) 这是解决此问题的正确方法吗?
最佳答案
我认为您的Promise 对象声明有问题。
$http
服务返回 promise ,但在您的示例中,您没有返回 promise ,而是使用 .success()
回调方法,并尝试返回结果。
因此,您必须构建一个 Promise 数组,并将其传递给您的 $q.all()
方法,该方法是为处理许多 Promise 而构建的。
我做了一个小例子:
Controller
(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);
})();
所以在这里,我们将参数传递给我们的 POST 请求,然后我们将能够将这些数据检索到您的 $q.all()
方法中。
关于javascript - 多个 Promise 对象 - 等待所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32434151/