多个承诺对象 - 等待所有

时间:2015-09-07 08:25:51

标签: javascript angularjs

请原谅这个冗长的问题,但我相信这些信息对于确定应用程序中的错误至关重要。

循环配置设置:

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)这是解决这个问题的正确方法吗?

1 个答案:

答案 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()方法中。