(function () { 'use strict'; var app = angular.module('sysMgrApp'); app.factory('invoicesService', ['$http', '$q', function($http, $q) { var deferredMeta = null; var invokeCallNumber = 0; // Implementation var getMetaData = function () { if (deferredMeta) { return deferredMeta.promise; } deferredMeta = $q.defer(); if (service.metaData) deferredMeta.resolve(service.metaData); else { $http.get('/api/invoices/metadata') .success(function (data) { invokeCallNumber++; window.console && console.log('Calling http service ' + invokeCallNumber + ' time...') service.metaData = data; deferredMeta.resolve(data); }) .error(function (data, status, header, config) { deferredMeta.reject(status); }); } return deferredMeta.promise; }; var getInvoices = function (queryRequest) { var deferred = $q.defer(); $http.get('/api/invoices', { params: queryRequest }) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; }; var getAccountInvoices = function (queryRequest) { var deferred = $q.defer(); $http.get('/api/invoices/getAccountInvoices', { params: queryRequest }) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; }; var getNonFinalizedInvoices = function(queryRequest) { var deferred = $q.defer(); $http.get('/api/invoices/getInvoicesToApplyFees', { params: queryRequest }) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; }; var processPayments = function (transactionObject) { var deferred = $q.defer(); $http.post('/api/invoices/processPayments', transactionObject) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; }; var getAccountInvoices = function (queryRequest) { var deferred = $q.defer(); $http.get('/api/invoices/getAccountInvoices', { params: queryRequest }) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; }; var getInvoicesToBePaid = function (queryRequest) { var deferred = $q.defer(); $http.get('/api/invoices/getInvoicesToBePaid', { params: queryRequest }) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; }; var getInvoice = function (id) { var deferred = $q.defer(); $http.get('/api/invoices/' + id) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; }; var createInvoice = function (invoice) { var deferred = $q.defer(); $http.post('/api/invoices', invoice) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; }; var saveInvoice = function (invoice) { var deferred = $q.defer(); $http.put('/api/invoices', invoice) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(data, status); }); return deferred.promise; }; var deleteInvoice = function (invoiceNo) { var deferred = $q.defer(); $http.delete('/api/invoices/' + invoiceNo) .success(function (data) { deferred.resolve(data); }) .error(function (data, status, header, config) { deferred.reject(status); }); return deferred.promise; }; // Interface var service = { metaData: null, getMetaData: getMetaData, getInvoices: getInvoices, getAccountInvoices: getAccountInvoices, getInvoicesToBePaid: getInvoicesToBePaid, getInvoice: getInvoice, createInvoice: createInvoice, saveInvoice: saveInvoice, deleteInvoice: deleteInvoice, processPayments: processPayments }; return service; }]); })();BTW, it's good thing I posted as I see that I forgot to declare a new function I just added.