推迟返回工厂直到循环完全完成angularjs

时间:2017-03-03 18:01:22

标签: javascript angularjs angularjs-factory

我正在尝试创建一个从API获取对象后返回对象数组的方法。问题是工厂的返回发生在所有呼叫完成之前。我已经尝试使用$ q.defer但它仍然在它准备发货之前发送了回报。 这就是我到目前为止所提出的。

angular.module('watchList').factory('storageService', ['$http', '$q', function ($http, $q) {
storage = {};

storage.getMovies = function () {

    var movies = localStorage.getItem('movies');
    var movieArray = angular.fromJson(movies);
    var newArray = [];
    var defer = $q.defer();

    angular.forEach(movieArray, function (id) {
            newArray.push($http.get(api + id));
    });
    $q.all(newArray).then(function (response) {
            defer.resolve(response);
     });

    return defer.promise;
}

这是我试图通过

进行调用的控制器
angular.module('watchList').controller('watchListController', ['$scope', 'storageService', function ($scope, storageService) {
$scope.movies = storageService.getMovies();

我希望循环在返回数组之前完成所有操作。

2 个答案:

答案 0 :(得分:0)

您无需创建承诺,只需返回$q.all(newArray)调用返回的承诺。

事情是,当它只是异步可用时,你不能指望同步获得结果。因此,您需要继续使用then

storage.getMovies = function () {
    var movies = localStorage.getItem('movies');
    var movieArray = angular.fromJson(movies);
    var newArray = movieArray.map(function (id) {
        return $http.get(api + id);
    });
    return $q.all(newArray);
}

storageService.getMovies().then(function(movies) {
    $scope.movies = movies;
    // ... other code working with $scope.movies 
});

附注:map方法执行您对forEach所做的操作,但会立即返回数组,这非常实用。

答案 1 :(得分:-1)

getMovies会立即返回一个承诺。你需要使用"然后"等待那个承诺。

$scope.movies = storageService.getMovies().then((response) => ...)