(function () { 'use strict'; var app = angular.module('sysMgrApp'); app.factory('invoicesService', ['$http', '$q', function($http, $q) { // 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; var deferred = null; // Implementation var getMetaData = function () { if (deferred !== undefined) { return deferred.promise; } 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; }; 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 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; }; }]); })();I can try moving functions declaration to the top of the code (as I've done yesterday to fix this problem) but I don't see why it has to be this way.