我正在尝试创建一个从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();
我希望循环在返回数组之前完成所有操作。
答案 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) => ...)