app.factory('invoicesService', ['$http', '$q', function($http, $q) { // Interface var service = { metaData: null, getMetaData: getMetaData } return service; // Implementation function getMetaData() { var deferred = $q.defer(); if (service.metaData) deferred.resolve(service.metaData); else { $http.get('/api/invoices/metadata') .success(function (data) { service.metaData = data; deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); } return deferred.promise; }; }You don't have to make the metaData public, but my guess is that's what you actually want so it stays accessible and updateable by external code.
>app.factory('invoicesService', ['$http', '$q', function($http, $q) { > > var metaData = null; > > var getMetaData = function () { > var deferred = $q.defer(); > > if (angular.isObject(metaData)) > deferred.resolve(metaData); > else { > $http.get('/api/invoices/metadata') > .success(function (data) { > metaData = data; > deferred.resolve(data); > > }) > .error(function (data, status, header, config) { > deferred.reject(status); > }); > } > return deferred.promise; > };>
>>if (angular.isObject(metaData)) { >> deferred.resolve(metaData); >> return deferred.promise; >>} >>>>
>>>invoicesService.getMetaData().then(function (data) { >>> $scope.invoicesMetaData = data; >>> >>> });>>>
>>>app.factory('invoicesService', ['$http', '$q', function($http, $q) { >>> >>> var metaData = null; >>> >>> var getMetaData = function () { >>> if (angular.isObject(metaData)) >>> return metaData; >>> >>> var deferred = $q.defer(); >>> $http.get('/api/invoices/metadata') >>> .success(function (data) { >>> metaData = data; >>> deferred.resolve(data); >>> >>> }) >>> .error(function (data, status, header, config) { >>> deferred.reject(status); >>> }); >>> return deferred.promise; >>> };>>>