$q.all и создание нового объекта не работает в представлении

У меня проблемы с тем, что $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 и объекты


person jody tate    schedule 01.02.2014    source источник


Ответы (2)


$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);
});
person dimirc    schedule 01.02.2014
comment
Это работает, но не совсем так, как мне нужно. Это создает восемь объектов, а не четыре с двумя внутренними объектами. - person jody tate; 02.02.2014
comment
Проверьте обновленный ответ. Вы можете вложить несколько $q.all, чтобы задать необходимый формат - person dimirc; 02.02.2014
comment
Это сделало это! (Есть посторонний ; в обновлении на .promise;);, но редактор не дал мне исправить только один символ за раз) - person jody tate; 02.02.2014
comment
небольшая опечатка, я убрал лишнюю точку с запятой - person dimirc; 02.02.2014

Можешь сделать плнкр? Кроме того, ваш массив «обещаний» - это не обещания, а настраиваемый объект, в котором одно свойство является обещанием, а другое - чем-то другим. Если вы хотите сделать хеш обещания, он должен выглядеть так:

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

$q.all(promises).then(...
person Erik Donohoo    schedule 01.02.2014