javascript - 多个 Promise 对象 - 等待所有对象

标签 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++) {

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/

相关文章:

javascript - 限制显示数组对象

javascript - 为什么我的 SVG 形状之间存在间隙?

javascript - iframe JS富文本编辑器问题

java - AngularJS 指令替代 jsp 标签库?

javascript - 为什么我在 select2 : Uncaught TypeError: Cannot read property 'hasClass' of null? 上遇到这个 javascript 异常

javascript - 根据javascript/angularjs中的括号解析AND和OR条件语句?

javascript - 在 iPad 上播放 HTML5 视频并寻找

javascript - 如何使用 jQuery 获取 <td> 的值?

angularjs - 如何更改子窗口文本框中反射(reflect)表中父窗口记录的值?

javascript - 无法使用 vm 绑定(bind)到范围。 controller/html 中的符号