From 6605adf6d96cee2ef53dfad24e99d325df732cab Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Wed, 17 Apr 2013 14:15:27 +0800 Subject: feat($q): add $q.always() method Add $q.always(callback) method that is always called whether the promise is successful or fails; includes unit tests and updates documentation. --- src/ng/q.js | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/ng/q.js') diff --git a/src/ng/q.js b/src/ng/q.js index 33ca663a..22c9caa9 100644 --- a/src/ng/q.js +++ b/src/ng/q.js @@ -91,6 +91,11 @@ * This method *returns a new promise* which is resolved or rejected via the return value of the * `successCallback` or `errorCallback`. * + * - `always(callback)` – allows you to observe either the fulfillment or rejection of a promise, + * but to do so without modifying the final value. This is useful to release resources or do some + * clean-up that needs to be done whether the promise was rejected or resolved. See the [full + * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for + * more information. * * # Chaining promises * @@ -236,6 +241,42 @@ function qFactory(nextTick, exceptionHandler) { } return result.promise; + }, + always: function(callback) { + + function makePromise(value, resolved) { + var result = defer(); + if (resolved) { + result.resolve(value); + } else { + result.reject(value); + } + return result.promise; + } + + function handleCallback(value, isResolved) { + var callbackOutput = null; + try { + callbackOutput = (callback ||defaultCallback)(); + } catch(e) { + return makePromise(e, false); + } + if (callbackOutput && callbackOutput.then) { + return callbackOutput.then(function() { + return makePromise(value, isResolved); + }, function(error) { + return makePromise(error, false); + }); + } else { + return makePromise(value, isResolved); + } + } + + return this.then(function(value) { + return handleCallback(value, true); + }, function(error) { + return handleCallback(error, false); + }); } } }; -- cgit v1.2.3