推迟工厂返回,直到循环完成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();
我想它返回前阵的循环来完成一切拨打电话的控制器。
答
您不需要创建承诺,只需返回由$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
做什么,而是立即返回数组,这是相当实用的。
答
getMovies将立即返回一个承诺。你需要用“那么”来等待这个承诺。
$scope.movies = storageService.getMovies().then((response) => ...)
看看这里。它会帮助你http://stackoverflow.com/questions/18983138/callback-after-all-asynchronous-foreach-callbacks-are-已完成 –
把你的回报放在一个函数中,并从你的api成功回调中调用它。这样,直到api调用完成后,您才会返回任何内容。 – PersyJack