>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; > };>
app.factory('invoicesService', ['$http', '$q', function ($http, $q) { var metaData = null; var inProcess = false; var getMetaData = function () { while (inProcess === true) { } if (angular.isObject(metaData)) return metaData; inProcess = true; var deferred = $q.defer(); $http.get('/api/invoices/metadata') .success(function (data) { metaData = data; inProcess = false; deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; } }]);Angular doesn't have a synchronous option for $http so an altenative would be to fall back to using a XMLHttpRequest synchronously:
var req = new XMLHttpRequest(); req.open('GET', '/api/invoices/metadata', false); req.send(null); if (req.status === 200) { //etc........