$http returns a promise, we can use that instead of creating a new one with $q. Once the promise is resolved, we can keep returning it.
.factory('myService', ['$http','$q', function($http, $q) {
var items = [];
var last_request_failed = true;
var promise = undefined;
return {
getItems: function() {
if(!promise || last_request_failed) {
promise = $http.get('test.json').then(
function(response) {
last_request_failed = false;
items = response.data;
return items;
},function(response) { // error
last_request_failed = true;
return $q.reject(response);
});
}
return promise;
},
};
}])
In your controller:
myService.getItems().then(
function(data) { $scope.data = data; }
);