$ q.all并创建一个在视图中不起作用的新对象

时间:2014-02-01 00:54:44

标签: angularjs promise q

我在$q.all无法解析AngularJS时遇到困难。我可能没有正确描述事情,但这至少是这种情况。

服务

app.factory('myService', function($http){
    return {
        get: function () {
            return $http.get('http://localhost:8001/');
        }
    };
});

在控制器

angular.forEach(array, function(item){
    promises.push({foo:myService.get(), bar: item});
});
$q.all(promises).then(function(results){
    $log.info(results);
    $scope.results = results;
});

在视图中,从bar获取值的任何内容都会正确显示。但是,从foo获取其值的任何内容都是空白的。在控制台中bar是一个可检查的对象,正如您所期望的那样。但是foo仍然是一个承诺。它具有承诺的所有方法,但没有相关的数据。

因此,不知何故,$ q.all在结果应用于$scope时未得到解决。为什么,我不确定。

我会注意到,我已基于以下内容完成了基于此处的内容:angular.forEach and objects

2 个答案:

答案 0 :(得分:4)

$q.all期待一系列承诺。尝试这样的事情:

angular.forEach(array, function(item){
    var foo = myService.get();
    var bar = myOtherService.get();
    promises.push(foo); 
    promises.push(bar);  
});

$q.all(promises).then(function(results){
    $log.info(foo);
    $log.info(bar); 
});

<强>更新

如果你需要,你可以嵌套多个$ q.all

angular.forEach(array, function(item){

    var deferred = $q.defer();

    $q.all([myService.get(), myOtherService.get()]).then(function(results){
      deferred.resolve({foo:results[0], bar: results[1]});
    });  

    promises.push(deferred.promise);

});

$q.all(promises).then(function(results){
    $log.info(results);
});

答案 1 :(得分:0)

你能做一个plnkr吗?你的“承诺”数组也不是承诺,而是一个自定义对象,其中一个属性是promise,另一个属性是其他东西。如果你想做一个promise hash,它应该是这样的:

var promises = {};
angular.forEach(array, function(item){
    promises[item.foo] = item.promise;
});

$q.all(promises).then(...