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

问题描述:

我试图做一个方法,从API获取对象后返回的对象数组。问题是,在所有的通话结束之前,工厂的返回都会发生。我试过使用$ q.defer,但它仍然在准备发货前发送回报。 这就是我到目前为止所提出的。推迟工厂返回,直到循环完成angularjs

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(); 

我想它返回前阵的循环来完成一切拨打电话的控制器。

+0

看看这里。它会帮助你http://stackoverflow.com/questions/18983138/callback-after-all-asynchronous-foreach-callbacks-are-已完成 –

+0

把你的回报放在一个函数中,并从你的api成功回调中调用它。这样,直到api调用完成后,您才会返回任何内容。 – PersyJack

您不需要创建承诺,只需返回由$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做什么,而是立即返回数组,这是相当实用的。

+0

我现在使用angular 1,它没有angular.map。我尝试了angular.forEach,但没有奏效。 – Knikedix

+0

请尝试使用数组方法'map'。查看更新的代码。 – trincot

+0

谢谢你的工作很棒! – Knikedix

getMovies将立即返回一个承诺。你需要用“那么”来等待这个承诺。

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