;(function(){ 'use strict'; function AugmentedDeferredService($q) { this.defer = function() { var deferred = $q.defer(), promise = deferred.promise, isResolved = false, isRejected = false, updateCallbackQueue = []; // Retain the initial values var nonDecoratedValues = { resolve: deferred.resolve, reject: deferred.reject, then: promise.then }; // Augment the methods resolve, reject, then, update deferred.resolve = function() { if(isResolved && !isRejected) { updateCallbackQueue.forEach(function(cb){ cb.apply({}, arguments); }); } else { isResolved = true; nonDecoratedValues.resolve.apply(deferred, arguments); } }; deferred.reject = function() { if(!isResolved){ isRejected = true; nonDecoratedValues.reject.apply(deferred, arguments); } }; promise.then = function() { var augmentedPromise = nonDecoratedValues.then.apply(promise, arguments); augmentedPromise.update = promise.update; return augmentedPromise; }; promise.update = function(cb) { updateCallbackQueue.push(cb); return promise; } return deferred; }; } AugmentedDeferredService.$inject = ['$q']; angular .module('app') .service('AugmentedDeferredService', AugmentedDeferredService); })();