var deferred = null; function getMetaData() { if (deferred !== undefined) { return deferred.promise; } deferred = $q.defer(); if (service.metaData) deferred.resolve(service.metaData); else { service.inProcess = true; $http.get('/api/invoices/metadata') .success(function (data) { service.metaData = data; service.inProcess = false; deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); } return deferred.promise; };(Tried this briefly. Seems to work - i.e. two results; one call to the server.....)